diff --git a/.cspell.json b/.cspell.json index a37d474..47b9a92 100644 --- a/.cspell.json +++ b/.cspell.json @@ -1,9 +1,9 @@ { - "version": "0.2", - "dictionaryDefinitions": [ - { "addWords": true, "path": ".cspell/dictionary.txt", "name": "dictionary" } - ], - "language": "en", - "dictionaries": ["dictionary"], - "ignorePaths": ["dist"] + "language": "en", + "dictionaries": ["dictionary"], + "ignorePaths": ["dist"], + "dictionaryDefinitions": [ + { "path": ".cspell/dictionary.txt", "addWords": true, "name": "dictionary" } + ], + "version": "0.2" } diff --git a/.cspell/dictionary.txt b/.cspell/dictionary.txt index 2de4701..12c8d79 100644 --- a/.cspell/dictionary.txt +++ b/.cspell/dictionary.txt @@ -1853,3 +1853,41 @@ zurück ōnin καλός σθένος +bestellt +Bilder +einfach +erntet +Erste +Extremsituationen +Fortgeschrittene +gesunde +Handwerk +Hilfe +Jagen +Kochen +Künste +meistern +middlewares +Nahrung +natürlich +Notfallversorgung +pagefind +Praxisführer +Sammeln +schnell +seinen +sirv +Swup +swup +trainied +Überleben +Überlebenstechniken +ultimative +Unlighthouse +unlighthouse +Vergessene +Wildnis +Workflo +animationend +keyframes +keydown diff --git a/astro.config.mjs b/astro.config.mjs index 9e8f87f..795670e 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -4,6 +4,7 @@ import prefetch from '@astrojs/prefetch'; import sitemap from '@astrojs/sitemap'; import tailwind from '@astrojs/tailwind'; import { astroImageTools } from 'astro-imagetools'; +import pagefind from 'astro-pagefind'; import webmanifest from 'astro-webmanifest'; import { defineConfig } from 'astro/config'; import serviceWorker from 'astrojs-service-worker'; @@ -32,6 +33,7 @@ export default defineConfig({ }), astroImageTools, prefetch(), + pagefind(), sitemap({ filter: (page) => page !== 'https://www.stefanimhoff.de/cv/' && @@ -86,5 +88,6 @@ export default defineConfig({ compressHTML: true, build: { inlineStylesheets: 'always', + client: './dist', }, }); diff --git a/package.json b/package.json index aab6208..901f8c6 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "astro": "^2.7.2", "astro-icon": "^0.8.1", "astro-imagetools": "^0.8.1", + "astro-pagefind": "^1.2.1", "astro-seo": "^0.7.4", "astro-webmanifest": "^0.6.0", "astrojs-service-worker": "^1.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2a0bfa1..e4b46d8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -57,6 +57,9 @@ dependencies: astro-imagetools: specifier: ^0.8.1 version: 0.8.1(astro@2.7.2) + astro-pagefind: + specifier: ^1.2.1 + version: 1.2.1(astro@2.7.2) astro-seo: specifier: ^0.7.4 version: 0.7.4 @@ -336,6 +339,19 @@ packages: - supports-color dev: false + /@astrojs/node@5.3.0(astro@2.7.2): + resolution: {integrity: sha512-q7gJEPSZzC4FIRNmq3ks6mw0Jby4irXTfRhbOPOS4HRmbu4FDANnRqnZBOGe96cfBQTgDC3/FhQccDQtx+n4pg==} + peerDependencies: + astro: ^2.7.0 + dependencies: + '@astrojs/webapi': 2.2.0 + astro: 2.7.2(@types/node@20.3.2)(sharp@0.32.1) + send: 0.18.0 + server-destroy: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: false + /@astrojs/preact@2.2.1(preact@10.15.1): resolution: {integrity: sha512-lObgrX/qfK2sEnGDWoyQ8KojFJ54FIKB4TeywWmgj4ZTg0yLnvvOz6ReyPQ8VfR/1MU+vWs22jE4cuZJ/vPnOA==} engines: {node: '>=16.12.0'} @@ -4248,6 +4264,10 @@ packages: '@octokit/openapi-types': 18.0.0 dev: true + /@pagefind/default-ui@0.12.0: + resolution: {integrity: sha512-O+27oCGwIjHjcb3AMJ9J1KWwXqv+hm71jCfTyUf+BrJusNBpgX4BaqKRRx8rbElYew2aglqf9yl5wYJUt5w33Q==} + dev: false + /@pkgr/utils@2.4.1: resolution: {integrity: sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -4280,6 +4300,10 @@ packages: config-chain: 1.1.13 dev: true + /@polka/url@1.0.0-next.21: + resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} + dev: false + /@preact/compat@17.1.2(preact@10.15.1): resolution: {integrity: sha512-7pOZN9lMDDRQ+6aWvjwTp483KR8/zOpfS83wmOo3zfuLKdngS8/5RLbsFWzFZMGdYlotAhX980hJ75bjOHTwWg==} peerDependencies: @@ -5030,7 +5054,6 @@ packages: debug: 4.3.4(supports-color@9.4.0) transitivePeerDependencies: - supports-color - dev: true /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} @@ -5431,6 +5454,20 @@ packages: imagetools-core: 3.0.2 dev: false + /astro-pagefind@1.2.1(astro@2.7.2): + resolution: {integrity: sha512-Yi8+NEtEc5fz260hG+tnH3UOSPEEcgHxYDbDPxRFeJm/E5opBXz7Kx4D297f/SZhxkPPHzPgjJWD3+dCp95C8g==} + peerDependencies: + astro: ^2.0.4 + dependencies: + '@astrojs/node': 5.3.0(astro@2.7.2) + '@pagefind/default-ui': 0.12.0 + astro: 2.7.2(@types/node@20.3.2)(sharp@0.32.1) + pagefind: 0.12.0 + sirv: 2.0.3 + transitivePeerDependencies: + - supports-color + dev: false + /astro-seo@0.7.4: resolution: {integrity: sha512-E+wJmxOnvBRjgzVctdGk/VdwoEqeQ6Q/KgVW2wRBXZWJVDgOweB32Da/UiH0/FpGncPzo2daOrc08DNn5wTanw==} dev: false @@ -6994,7 +7031,6 @@ packages: optional: true dependencies: ms: 2.0.0 - dev: true /debug@4.3.4(supports-color@9.4.0): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -7166,7 +7202,6 @@ packages: /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - dev: true /deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} @@ -7180,7 +7215,6 @@ packages: /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: true /detect-file@1.0.0: resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} @@ -7409,7 +7443,6 @@ packages: /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: true /ejs@3.1.9: resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} @@ -7447,7 +7480,6 @@ packages: /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} - dev: true /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -7610,7 +7642,6 @@ packages: /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: true /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} @@ -7860,7 +7891,6 @@ packages: /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} - dev: true /event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} @@ -8548,7 +8578,6 @@ packages: /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} - dev: true /from2-array@0.0.4: resolution: {integrity: sha512-0G0cAp7sYLobH7ALsr835x98PU/YeVF7wlwxdWbCUaea7wsa7lJfKZUAo6p2YZGZ8F94luCuqHZS3JtFER6uPg==} @@ -9248,7 +9277,6 @@ packages: setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 - dev: true /http-proxy-middleware@2.0.6(debug@4.3.4): resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} @@ -9295,7 +9323,6 @@ packages: debug: 4.3.4(supports-color@9.4.0) transitivePeerDependencies: - supports-color - dev: true /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} @@ -11578,16 +11605,19 @@ packages: engines: {node: '>=4'} dev: false + /mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + dev: false + /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true /multiparty@4.2.3: resolution: {integrity: sha512-Ak6EUJZuhGS8hJ3c2fY6UW5MbkGUPMBEGd13djUzoY/BHqV/gTuFWtC6IuVA7A2+v3yjBS6c4or50xhzTQZImQ==} @@ -12163,7 +12193,6 @@ packages: engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 - dev: true /on-headers@1.0.2: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} @@ -12455,6 +12484,17 @@ packages: semver: 7.5.3 dev: true + /pagefind@0.12.0: + resolution: {integrity: sha512-LHUmlYYweBM6/rK1G+7z2q2WjYeycrB7g5Kuw0w6yMkYztzsEdO2Qj2pJ3z8gsWV8eJsYQyAGOAdqE3SZWlCqA==} + hasBin: true + requiresBuild: true + dependencies: + https-proxy-agent: 5.0.1(supports-color@9.4.0) + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - supports-color + dev: false + /pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -13835,6 +13875,10 @@ packages: ipaddr.js: 1.9.1 dev: true + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + /ps-list@8.1.1: resolution: {integrity: sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -13908,7 +13952,6 @@ packages: /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - dev: true /raw-body@2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} @@ -14682,7 +14725,6 @@ packages: statuses: 2.0.1 transitivePeerDependencies: - supports-color - dev: true /sentence-case@3.0.4: resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} @@ -14734,7 +14776,6 @@ packages: /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: true /sharp@0.29.3: resolution: {integrity: sha512-fKWUuOw77E4nhpyzCCJR1ayrttHoFHBT2U/kR/qEMRhvPEcluG4BKj324+SCO1e84+knXHwhJ1HHJGnUt4ElGA==} @@ -14877,6 +14918,15 @@ packages: dependencies: is-arrayish: 0.3.2 + /sirv@2.0.3: + resolution: {integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==} + engines: {node: '>= 10'} + dependencies: + '@polka/url': 1.0.0-next.21 + mrmime: 1.0.1 + totalist: 3.0.1 + dev: false + /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} dev: false @@ -15126,7 +15176,6 @@ packages: /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - dev: true /stdin-discarder@0.1.0: resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} @@ -15813,7 +15862,6 @@ packages: /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - dev: true /token-types@4.2.1: resolution: {integrity: sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==} @@ -15838,6 +15886,11 @@ packages: resolution: {integrity: sha512-2Ulkc8T7mXJ2l0W476YC/A209PR38Nw8PuaCNtk9uI3t1zzFdGQeWYGQvmj2PZkVvRC/Yoi4xQKMRnWc/N29tQ==} dev: true + /totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + dev: false + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true diff --git a/public/pinterest-428b1.html b/public/pinterest-428b1.html deleted file mode 100755 index 21f7f67..0000000 --- a/public/pinterest-428b1.html +++ /dev/null @@ -1,293 +0,0 @@ - - - - - - - Pinterest - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
-

- Hi, Stefan! -

-
-
- - - - - - - - - - - - - - - - -
- - - - -
- - - - - - - - -
- - Stefan Imhoff - - -

- Looking good! You are ready - to return to the - verification page and - complete the process. -

-
- - - - -
- - -
-
-
-
-
-

- Happy pinning! -

-
-

- ©2015 Pinterest, Inc. - | All Rights - Reserved
Privacy Policy - | - Terms and Conditions -

-
-
- - diff --git a/src/components/MainNavigation.astro b/src/components/MainNavigation.astro index ed71f10..b3a1e2f 100644 --- a/src/components/MainNavigation.astro +++ b/src/components/MainNavigation.astro @@ -2,10 +2,11 @@ import { Link } from '.'; import navigation from '../data/navigation.json'; +import SearchLink from './SearchLink.astro'; --- diff --git a/src/components/Scripts.astro b/src/components/Scripts.astro index 6a097f8..cccfd81 100644 --- a/src/components/Scripts.astro +++ b/src/components/Scripts.astro @@ -15,6 +15,7 @@ import '../styles/sal.css'; declare const sal: any; const swup = new Swup({ + ignoreVisit: (url, { el } = {}) => el?.closest('[data-pagefind-ui] a'), plugins: [ new SwupFadeTheme(), new SwupHeadPlugin(), @@ -41,6 +42,7 @@ import '../styles/sal.css'; } } + // Register scripts after swup page transition swup.on('pageView', () => { if (typeof sal !== 'undefined') { sal({ @@ -50,6 +52,8 @@ import '../styles/sal.css'; setActiveLink(); setUpLink(); setEmailLink(); + setSearchModalLink(); + setSearchLink(); } }); @@ -78,6 +82,45 @@ import '../styles/sal.css'; }); } + function setSearchLink() { + const dialog = document.querySelector('dialog'); + const openDialogLink = document.getElementById('search-link'); + + openDialogLink?.addEventListener('click', (event) => { + event.preventDefault(); + dialog?.showModal(); + }); + + document.addEventListener('keydown', (event) => { + if (event.key === '/') { + event.preventDefault(); + dialog?.showModal(); + } + }); + } + + function setSearchModalLink() { + const dialog = document.querySelector('dialog'); + + dialog?.addEventListener('click', (event) => { + if (event.target === dialog) { + if (!dialog.classList.contains('hide')) { + dialog.classList.add('hide'); + dialog.addEventListener( + 'animationend', + (animationEvent) => { + if (animationEvent.animationName === 'hide-modal') { + dialog.close(); + dialog.classList.remove('hide'); + } + }, + { once: true } + ); + } + } + }); + } + function handleEmailClick(event: Event) { event.preventDefault(); const currentTarget = event.currentTarget; @@ -101,6 +144,8 @@ import '../styles/sal.css'; setActiveLink(); setUpLink(); setEmailLink(); + setSearchLink(); + setSearchModalLink(); diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index a0d0e1c..e38498a 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -8,6 +8,7 @@ import { isProduction } from '../utils'; import ThemeProvider from '../components/ThemeProvider.astro'; import PageHeader from '../components/PageHeader.astro'; import PageFooter from '../components/PageFooter.astro'; +import SearchModal from '../components/SearchModal.astro'; import Scripts from '../components/Scripts.astro'; export interface Props { @@ -44,6 +45,7 @@ const schema = JSON.stringify({ url: site.url, }); +const pagefind = !noindex && { 'data-pagefind-body': '' }; const webManifest = isProduction && { rel: 'manifest', href: '/manifest.webmanifest', @@ -164,13 +166,14 @@ const webManifest = isProduction && { {header && }
-
+
{footer && }
+