From 4bed9958124bdbd91371e52e74afc47dc628cea2 Mon Sep 17 00:00:00 2001 From: Matthias Kretschmann Date: Wed, 16 Nov 2022 19:04:06 +0000 Subject: [PATCH] new favicon script --- .gitignore | 4 +- README.md | 55 +++++--- _content/meta.json | 2 +- next.config.js | 4 +- package-lock.json | 57 +++++++++ package.json | 9 +- public/apple-touch-icon.png | Bin 0 -> 5736 bytes public/favicon.ico | Bin 0 -> 2055 bytes public/favicon.svg | 27 ++++ public/gpg.txt | 185 +++++++++++++++++++++++++++ public/manifest/favicon-192.png | Bin 0 -> 5360 bytes public/manifest/favicon-512.png | Bin 0 -> 11131 bytes public/manifest/manifest.webmanifest | 1 + scripts/favicon.ts | 136 ++++++++++---------- src/components/Meta/Favicon.tsx | 102 ++------------- src/images/favicon-512.png | Bin 0 -> 16515 bytes src/images/favicon.png | Bin 6006 -> 0 bytes src/images/favicon.svg | 27 ++++ src/images/logo.svg | 13 +- 19 files changed, 428 insertions(+), 194 deletions(-) create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon.ico create mode 100644 public/favicon.svg create mode 100644 public/gpg.txt create mode 100644 public/manifest/favicon-192.png create mode 100644 public/manifest/favicon-512.png create mode 100644 public/manifest/manifest.webmanifest create mode 100644 src/images/favicon-512.png delete mode 100644 src/images/favicon.png create mode 100644 src/images/favicon.svg diff --git a/.gitignore b/.gitignore index ea226ea..133a6d1 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,6 @@ yarn-error.log* .swc coverage public/matomo.js -public/favicon/ \ No newline at end of file +# public/favicon* +# public/apple-touch-icon* +# public/manifest* \ No newline at end of file diff --git a/README.md b/README.md index 6975465..7875afb 100644 --- a/README.md +++ b/README.md @@ -25,10 +25,12 @@ - [📇 Client-side vCard creation](#-client-side-vcard-creation) - [💎 Importing SVG assets](#-importing-svg-assets) - [🍬 Typekit component](#-typekit-component) +- [🤓 Scripts](#-scripts) + - [🎈 Add a new project](#-add-a-new-project) + - [🌄 Favicon generation](#-favicon-generation) - [✨ Development](#-development) - [🔮 Linting](#-linting) - [👩‍🔬 Testing](#-testing) - - [🎈 Add a new project](#-add-a-new-project) - [🚚 Deployment](#-deployment) - [🏛 Licenses](#-licenses) @@ -124,6 +126,38 @@ If you want to know how, have a look at the respective component: - [`src/components/Typekit/index.tsx`](src/components/Typekit/index.tsx) +## 🤓 Scripts + +### 🎈 Add a new project + +To add a new project, run the following command. This adds a new item to the top of the `projects.yml` file, creating the title & slug from the argument: + +```bash +npm run new -- "Hello" +``` + +Then continue modifying the new entry in [`_content/projects.yml`](_content/projects.yml). + +Finally, add as many images as needed with the file name format and put into `public/images/`: + +```text +SLUG-01.png +SLUG-02.png +SLUG-03.png +... +``` + +### 🌄 Favicon generation + +This generates all required favcion sizes from: + +- `src/images/favicon-512.png` +- `src/images/favicon.svg` + +```bash +npm run favicon +``` + ## ✨ Development ```bash @@ -165,25 +199,6 @@ npm test Most test files live beside the respective component. Testing setup, fixtures, and mocks can be found in the `tests/` folder. -### 🎈 Add a new project - -To add a new project, run the following command. This adds a new item to the top of the `projects.yml` file, creating the title & slug from the argument: - -```bash -npm run new -- "Hello" -``` - -Then continue modifying the new entry in [`_content/projects.yml`](_content/projects.yml). - -Finally, add as many images as needed with the file name format and put into `public/images/`: - -```text -SLUG-01.png -SLUG-02.png -SLUG-03.png -... -``` - ## 🚚 Deployment Every branch or Pull Request is automatically deployed by [Vercel](https://vercel.com) with their GitHub integration, where the `main` branch is automatically aliased to `matthiaskretschmann.com`. A link to a preview deployment will appear under each Pull Request. diff --git a/_content/meta.json b/_content/meta.json index 4112c63..bcfcaf2 100644 --- a/_content/meta.json +++ b/_content/meta.json @@ -7,7 +7,7 @@ "available": "👔 Available for new projects. Let’s talk!", "unavailable": "Not available for new projects." }, - "gpg": "https://kretschmann.io/pub.gpg", + "gpg": "/gpg.txt", "addressbook": "/matthias-kretschmann.vcf", "bugs": "https://github.com/kremalicious/portfolio/issues/new", "matomoUrl": "https://analytics.kremalicious.com", diff --git a/next.config.js b/next.config.js index 13352d7..3ca45b8 100644 --- a/next.config.js +++ b/next.config.js @@ -23,7 +23,9 @@ const next = (phase, { defaultConfig }) => { return typeof defaultConfig.webpack === 'function' ? defaultConfig.webpack(config, options) : config - } + }, + // https://nextjs.org/docs/api-reference/next.config.js/react-strict-mode + reactStrictMode: true } return nextConfig diff --git a/package-lock.json b/package-lock.json index 8e466ce..fe01f0d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,6 +42,7 @@ "prepend": "^1.0.2", "prettier": "^2.7.1", "sharp": "^0.31.2", + "sharp-ico": "^0.1.5", "slugify": "^1.6.5", "stylelint": "^14.14.1", "stylelint-config-prettier": "^9.0.4", @@ -1933,6 +1934,12 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@canvas/image-data": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@canvas/image-data/-/image-data-1.0.0.tgz", + "integrity": "sha512-BxOqI5LgsIQP1odU5KMwV9yoijleOPzHL18/YvNqF9KFSGF2K/DLlYAbDQsWqd/1nbaFuSkYD/191dpMtNh4vw==", + "dev": true + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -5008,6 +5015,33 @@ "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==", "dev": true }, + "node_modules/decode-bmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/decode-bmp/-/decode-bmp-0.2.1.tgz", + "integrity": "sha512-NiOaGe+GN0KJqi2STf24hfMkFitDUaIoUU3eKvP/wAbLe8o6FuW5n/x7MHPR0HKvBokp6MQY/j7w8lewEeVCIA==", + "dev": true, + "dependencies": { + "@canvas/image-data": "^1.0.0", + "to-data-view": "^1.1.0" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/decode-ico": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/decode-ico/-/decode-ico-0.4.1.tgz", + "integrity": "sha512-69NZfbKIzux1vBOd31al3XnMnH+2mqDhEgLdpygErm4d60N+UwA5Sq5WFjmEDQzumgB9fElojGwWG0vybVfFmA==", + "dev": true, + "dependencies": { + "@canvas/image-data": "^1.0.0", + "decode-bmp": "^0.2.0", + "to-data-view": "^1.1.0" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/decode-named-character-reference": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", @@ -6797,6 +6831,12 @@ "node": ">=10.17.0" } }, + "node_modules/ico-endec": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ico-endec/-/ico-endec-0.1.6.tgz", + "integrity": "sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ==", + "dev": true + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -11406,6 +11446,17 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/sharp-ico": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/sharp-ico/-/sharp-ico-0.1.5.tgz", + "integrity": "sha512-a3jODQl82NPp1d5OYb0wY+oFaPk7AvyxipIowCHk7pBsZCWgbe0yAkU2OOXdoH0ENyANhyOQbs9xkAiRHcF02Q==", + "dev": true, + "dependencies": { + "decode-ico": "*", + "ico-endec": "*", + "sharp": "*" + } + }, "node_modules/sharp/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", @@ -12202,6 +12253,12 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, + "node_modules/to-data-view": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz", + "integrity": "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==", + "dev": true + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", diff --git a/package.json b/package.json index 7b95283..5db726e 100644 --- a/package.json +++ b/package.json @@ -8,10 +8,10 @@ "author": "Matthias Kretschmann ", "type": "module", "scripts": { - "start": "npm run pregenerate && next", - "build": "npm run pregenerate && next build", + "start": "next", + "build": "next build", "preview": "npm run build && next start", - "export": "npm run pregenerate && next export", + "export": "next export", "typecheck": "tsc", "lint:js": "next lint", "lint:css": "stylelint ./src/**/*.css", @@ -21,8 +21,7 @@ "test": "NODE_ENV=test npm run lint && npm run typecheck && npm run jest", "deploy:s3": "./scripts/deploy-s3.sh", "new": "ts-node-esm ./scripts/new.ts", - "favicon": "ts-node-esm ./scripts/favicon.ts", - "pregenerate": "npm run favicon" + "favicon": "ts-node-esm ./scripts/favicon.ts" }, "dependencies": { "@giphy/js-fetch-api": "^4.4.0", diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1e646822ae4b428ba56c2f873547d4cc9847d69f GIT binary patch literal 5736 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 TAprt6)q}j!p*}P7|I_*dL{O$8 literal 0 HcmV?d00001 diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..227fa1a --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,27 @@ + + + + + + + diff --git a/public/gpg.txt b/public/gpg.txt new file mode 100644 index 0000000..bce11da --- /dev/null +++ b/public/gpg.txt @@ -0,0 +1,185 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBFJyh/gBEACg999mhPygxNQkVT8cJBblRyOoXgf3eiDO0q1xtVtjIOV8HWaa +dmrA9kphQ3aQp9giq205mirl4H+mBdzUNtbjKSjO2OBC1Dsg0b7aHc0LBuAoLAXc +zXCa4XXespahBWj9TpzpB0jrK5tObF2VQ3TQlSaTPiwRpUlSMBNCN/6G3OlcNirQ +t7MozXXkngaY0murJ4n7jYnLM9yi4oPVz7nuVMguNCSsOZPha74AamWWhEL4v3lk +KUWJhZvAGGl5ygfI6u9qLj3HCvAGDlxxnM9KV2EqgSXx7MTkJ/Qz8135zOeUiy4t +oQC/OZ74Fy14bJwv0sLQp44JsNk21TpeV03dN8IrBs4/UfGUC6BQhPpPKkmo4vpT +6l3hMrHf/mLWtqqbsyC60Qi5WxGfoA8Z/WDW5miaZGe2HLxSjmM4Kqam3FAqcpiv +ZJjVg8vVb1DEUWQxDyXpyPgwxahMIb0oYhAipFpyUpo8zPVHTGkLU9nIl6/mj4JO +e0T1rcG/TFD1CbOBDqjUWs8M654o4v1FCIHEOtxHRnqXfhsRKdCykPrl58cIUKRB +VP+OkqkidgFfKP7prvywfI00j5QOTtwNTFb64MofCyyItHFk3WYn4VYs9C7cH3SZ +OlGLIaf7C6hSOK+QJNTZtoENSTnGMkW4QO/F73KZ6g3jKrBgCSTapOW5twARAQAB +tCdNYXR0aGlhcyBLcmV0c2NobWFubiA8bUBrcmV0c2NobWFubi5pbz6JAlcEEwEK +AEECGwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4ACGQEWIQSawPeQ7tdkoBg4yCm9 +PB8+3Xgx/AUCY2HE+wUJFLGkAwAKCRC9PB8+3Xgx/G0OD/9ppqHwIipu/MlsI97i +KIk9jsbrYP65hMXfHK+rsldCmZ9jGObT2TE14VTvEwJ7NskzGM5euYl/4E3nyPxx +aa325pX40493t6hsMPAqFVmUBOGbO+q3oQiJaOHoSOyMqW81hM4P310sYNzRKxPc +FLFEoangmXqwlhQy1DFNCCeKSuk0Pbf7p/OlVP/6aQ88K7zhzWNde1fmKH55zoXA +k88JamCKzOT6vHRCrU4PtdPX/4V3catVBo1kCICAVOsDOUeIu1N3jQG/Rsv7Gtm1 +7MTPlF4J19Txno73MOGdmaKqQwN6g+8kxqQCo60WmsW3x3x6j5h+Ii69mZ3giFpJ +kBPuhTNF/JBc/sie1uiyW2gHpBs5UfMnEKdpVuqHxAfc+pZKwnj0NCBAhNzEF0k8 +pJTJ7htPtoSbCy/xFVBC05D/VVhuFvC/7TIj8YIN27XJopTxAHQicCeK7y687kob +I1BpFw0DBKWAzsw16Un7MoK0kzyJ+V5V8JI5+B08CEu12DjRHm+RVWnZ/pAD75j/ +dHTJza4BV6r2P49SM+F+JGy8JVwtOy+rdNqba9mhyINljifxQF2llI8reo01Na9p +WrFt6ap4nlf2RKicsJcZghUGfUDgIUMtUd6T7x/fxgak5YJ8r2LRu4BsoAuA2ySx +30ge1Tq1p5jMYohXPSH07+Zr6rQsTWF0dGhpYXMgS3JldHNjaG1hbm4gPGRlc2tA +a3JlbWFsaWNpb3VzLmNvbT6JAlQEEwEKAD4CGwMFCwkIBwMFFQoJCAsFFgIDAQAC +HgECF4AWIQSawPeQ7tdkoBg4yCm9PB8+3Xgx/AUCY2HFCAUJFLGkAwAKCRC9PB8+ +3Xgx/ONXD/9IqIX7Hvrd8y8MCYCBX6b6d4Ll/Xq/CEXgFWOhCsTp+zD7xCfH9x1i +QFa4oU+gAQMoxgdvu1XMfYwL7KpcA34mkkqoD3+tKZ3P/4zu0/7eEECNIEaCi+Am +QBfBipfHCZUXOhsber3aLH9mI4q6Yff7se/BCwg5oh+Cei1rjif67i+zCJbOOqpP +4h3kekBcu5bz8wUP0DCfp9LRHRz9lhVaD0jww6SAhUIH2dgKgZUqsexni84inTnD +hMtvi2HK4agO2QjFBOwE5pI1n28Jcei/EUjQpSdw5xI8QMPQalc6Vj7qzszM7oqG +M3UJphzlZ3GP7/sbqmfNqmcRQKqpuR1OkOtdQbnuvZueraecPDn7kaVTH6/aDiqd +PRulwGf8vAYz2DLX8r507lgSHBEqCUw7wzXI/uPbFsfGNu9eDhskuHHQvsi3j4s3 +XD2RjpcNduSyZC36ZCX4UgUhHX9/wFKb+xdOLke2tDy6/K5mr55OBeYWEOlIXMFS +EeGJhZ2ySI9EYrPpRcaEx7qOjznaujxaGjkCrTTTPz/bQmYwbw/bw90+w9hSh+Km +/AUA9CvOjAvKVilZ00xqzpg35wS6czFN3PdPojp91fMNUIbonELk/qyS59Er/b9Y +xW+3Mb9p35q6d4jvvtlZLWc/y2OOGgptdQ/OEJhU5zaV8RVNCKnCPbQoTWF0dGhp +YXMgS3JldHNjaG1hbm4gPGtyZW1hQGpwYmVybGluLmRlPokCVAQTAQoAPgIbAwUL +CQgHAwUVCgkICwUWAgMBAAIeAQIXgBYhBJrA95Du12SgGDjIKb08Hz7deDH8BQJj +YcUIBQkUsaQDAAoJEL08Hz7deDH8PysP/jN45LeLMjiiGAr090sRtRNqmvljvWC4 +v1DlXxuLwCJFhB0U8cZMvx7uUU2PDJodecGiKunNBYAuz98WjMCTxMNnfT+cgkxv +lSmfa2wjz3l/otHWaeyLTfn48SBbSd/RoFF8sH2OaqWIde8iJ6n6OvGVluNboL8g ++ZL+O28Du+tsnZ4v7WNNJGBHJBOupaB19/ConKR/fUC8WlFV8WTC/6egWB6TbNjU +RUt/EPsc4hieU/bodJKmzYSVQcVoR/7x+wAnMNJrGS34tJN+2O1O9JobJVBCHsk5 +yMhs2XLrSIys5Xby1qFWk7zmdKP1NZaSeIh+4xXtbzURtO28Xqmry76s0tznqfss +uy323+Hdp8ynXP6MuDE/nlPQVI2BMbfCvMQzSp3dSRhq2+siYg2qoL0QNAaXAPUU +OxdH2ee84Hzx60s9kdnw5EHHQ6KZiCvuSABog0kldDAdIl8I2Kc8DtzZVBLPSWp3 +FPR7V4X8722tk6ZsZIMADJeslcSlnscRFPYh6gDrbzJCSj6IcG/wb8fHyUgMrLZb +3E8rZceWXa5fiIPtb6z4LcPS3dRWD7iK52Uqg+8N6IuG/OvlmY9+6X6OseUm+qq6 +FZrXQONGC09mPGGvCKCfEZYKITO2m1Rd2SWPh5UXop8277q3botsOhMnjaTiVQVf +xv37UFfGkdXBtC5NYXR0aGlhcyBLcmV0c2NobWFubiA8bWF0dGhpYXNAYmlnY2hh +aW5kYi5jb20+iQJUBBMBCgA+AhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAFiEE +msD3kO7XZKAYOMgpvTwfPt14MfwFAmNhxQgFCRSxpAMACgkQvTwfPt14Mfy2mQ// +QQMn8nGbGNovHBpOq/AehCNeQlrtY4ln6k09kLZ+Xyy7BNB3xR6zLbyl6uLgbQKk +d9q3/JFEPU8ZP/fH22AxR66R8vzcxWKeoow8EVpYLttyTl/JGFiFyv33xbhKynFC +zhHfOpPdpMu4oJf78kAUT/OTuiRQFMlpIXGLKbhwkikGXWuejGuRXKF2v7Fxc+6y +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 +=DXwP +-----END PGP PUBLIC KEY BLOCK----- diff --git a/public/manifest/favicon-192.png b/public/manifest/favicon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..c09314fe6265d4af775c5968bb9a35130f8b3055 GIT binary patch literal 5360 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 literal 0 HcmV?d00001 diff --git a/public/manifest/favicon-512.png b/public/manifest/favicon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..5b20a25b656d5f1b9734867d78fd682b1314a2d3 GIT binary patch literal 11131 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 PX-T%5?KkCabUF85b0D%m literal 0 HcmV?d00001 diff --git a/public/manifest/manifest.webmanifest b/public/manifest/manifest.webmanifest new file mode 100644 index 0000000..4cf7846 --- /dev/null +++ b/public/manifest/manifest.webmanifest @@ -0,0 +1 @@ +{"name":"matthias kretschmann","shortName":"mk","icons":[{"src":"/manifest/favicon-192.png","type":"image/png","sizes":"192x192"},{"src":"/manifest/favicon-512.png","type":"image/png","sizes":"512x512"}]} \ No newline at end of file diff --git a/scripts/favicon.ts b/scripts/favicon.ts index eea8640..02d8ba5 100644 --- a/scripts/favicon.ts +++ b/scripts/favicon.ts @@ -1,87 +1,83 @@ -import { favicons, FaviconImage } from 'favicons' import path from 'path' import fs from 'fs' +import sharp from 'sharp' +import ico from 'sharp-ico' -const imagesDirectory = path.resolve(path.join(process.cwd(), 'src', 'images')) -const source = `${imagesDirectory}/favicon.png` -const output = path.resolve(path.join(process.cwd(), 'public', 'favicon')) +const imagesSourcePath = path.resolve(path.join(process.cwd(), 'src', 'images')) +const faviconSource = `${imagesSourcePath}/favicon-512.png` +const faviconSourceSvg = `${imagesSourcePath}/favicon.svg` -const configuration = { - path: '/favicon', // Path for overriding default icons path. `string` - appName: 'matthias kretschmann', - appShortName: 'mk', - appDescription: null, - developerName: null, - developerURL: null, - dir: 'auto', - lang: 'en-US', - appleStatusBarStyle: 'black-translucent', // Style for Apple status bar: "black-translucent", "default", "black". `string` - display: 'minimal-ui', // Preferred display mode: "fullscreen", "standalone", "minimal-ui" or "browser". `string` - orientation: 'any', // Default orientation: "any", "natural", "portrait" or "landscape". `string` - scope: '/', // set of URLs that the browser considers within your app - start_url: '/?homescreen=1', - background_color: '#e7eef4', - theme_color: '#e7eef4', - preferRelatedApplications: false, - relatedApplications: undefined, - version: '1.0', - pixel_art: false, // Keeps pixels "sharp" when scaling up, for pixel art. Only supported in offline mode. - loadManifestWithCredentials: false, - manifestMaskable: `${imagesDirectory}/logo.svg`, // Maskable source image(s) for manifest.json. "true" to use default source. More information at https://web.dev/maskable-icon/. `boolean`, `string`, `buffer` or array of `string` - icons: { - android: true, - appleIcon: true, - appleStartup: false, - favicons: true, - windows: true, - yandex: false +const outputWebRoot = path.resolve(path.join(process.cwd(), 'public')) +const outputManifest = path.resolve( + path.join(process.cwd(), 'public', 'manifest') +) + +// All the sizes and meta we'll need +// https://evilmartians.com/chronicles/how-to-favicon-in-2021-six-files-that-fit-most-needs +const sizes = [32, 180, 192, 512] +const outputMeta = ` + + + + +` + +function createManifest(iconsizes: number[]) { + const manifest = { + name: 'matthias kretschmann', + shortName: 'mk', + icons: iconsizes.map((size) => ({ + src: `/manifest/favicon-${size}.png`, + type: 'image/png', + sizes: `${size}x${size}` + })) } + fs.writeFileSync( + `${outputManifest}/manifest.webmanifest`, + JSON.stringify(manifest) + ) } async function buildFavicons() { try { - const response = await favicons(source, configuration) - const allFilesToWrite = response.images.concat(response.files as any) + // Nuke all & create output folder first + fs.rmSync(outputManifest, { recursive: true, force: true }) + fs.rmSync(`${outputWebRoot}/apple-touch-icon.png`, { force: true }) + fs.rmSync(`${outputWebRoot}/favicon.ico`, { force: true }) + fs.mkdirSync(outputManifest, { recursive: true }) - fs.rmSync(output, { recursive: true, force: true }) + // copy over the svg, as it's handcrafted + fs.copyFileSync(faviconSourceSvg, `${outputWebRoot}/favicon.svg`) - allFilesToWrite.forEach((file) => { - const { name, contents } = file - const destination = `${output}/${name}` + // generate all the rest + await Promise.all( + sizes.map(async (size) => { + let destination = `${outputManifest}/favicon-${size}.png` + if (size === 180) destination = `${outputWebRoot}/apple-touch-icon.png` - try { - fs.readFileSync(destination, 'utf8') - } catch (error) { - // if there is no file, get data and write a fresh file - if (error.code === 'ENOENT') { - try { - fs.mkdirSync(output, { recursive: true }) - fs.writeFileSync(destination, contents) - } catch (error) { - throw new Error("Couldn't write favicon file") - } - } - } - }) - - const destinationHtml = `${output}/_meta.html` - - try { - fs.readFileSync(destinationHtml, 'utf8') - } catch (error) { - // if there is no file, get data and write a fresh file - if (error.code === 'ENOENT') { - try { - fs.mkdirSync(output, { recursive: true }) - fs.writeFileSync( - destinationHtml, - response.html.reverse().toString().replaceAll(',', '') + if (size === 32) { + await ico.sharpsToIco( + [sharp(faviconSource)], + `${outputWebRoot}/favicon.ico`, + { sizes: [32, 24, 16], resizeOptions: {} } ) - } catch (error) { - throw new Error("Couldn't write favicon file") + fs.rmSync(destination, { force: true }) + } else { + await sharp(faviconSource).resize(size, size).toFile(destination) } - } - } + }) + ) + + // write out manifest + createManifest([192, 512]) + + console.log(` + ----------------------------- + Favicon generation complete! + ----------------------------- + Add this to src/components/Meta/Favicon.tsx: + ${outputMeta} + `) } catch (error) { console.error(error.message) } diff --git a/src/components/Meta/Favicon.tsx b/src/components/Meta/Favicon.tsx index 2d487a5..19a2694 100644 --- a/src/components/Meta/Favicon.tsx +++ b/src/components/Meta/Favicon.tsx @@ -3,100 +3,14 @@ import Head from 'next/head' const MetaFavicons = () => { return ( - - - - - - - - - - - - - - - - - - - - - - - - {/* */} - + {/* + Stop the favicon madness + https://evilmartians.com/chronicles/how-to-favicon-in-2021-six-files-that-fit-most-needs + */} + + + + ) } diff --git a/src/images/favicon-512.png b/src/images/favicon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..669872c42c1725da7a39387505f56ee96c172c05 GIT binary patch literal 16515 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%0A+aR$PygtnI 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 diff --git a/src/images/favicon.svg b/src/images/favicon.svg new file mode 100644 index 0000000..227fa1a --- /dev/null +++ b/src/images/favicon.svg @@ -0,0 +1,27 @@ + + + + + + + diff --git a/src/images/logo.svg b/src/images/logo.svg index d218227..b289b46 100644 --- a/src/images/logo.svg +++ b/src/images/logo.svg @@ -1,3 +1,12 @@ - - + +