diff --git a/.eleventy.js b/.eleventy.js index a4f0909e..9b06dc7c 100644 --- a/.eleventy.js +++ b/.eleventy.js @@ -1,4 +1,3 @@ -const sass = require('sass'); const fs = require('node:fs'); const path = require('node:path'); const moment = require('moment'); @@ -7,10 +6,6 @@ const markdownIt = require('markdown-it'); const markdownItAnchor = require('markdown-it-anchor'); const pluginRss = require('@11ty/eleventy-plugin-rss').default; const striptags = require('striptags'); -// const upgradeHelper = require('@11ty/eleventy-upgrade-help'); - -// install prism plugins -require('prismjs/plugins/custom-class/prism-custom-class'); const REGEX_IMAGE_EXTENSION = '(jpg|png|gif)'; @@ -24,28 +19,9 @@ module.exports = function (eleventyConfig) { } console.log('Cleared _site folder'); - const isServing = process.argv.includes('--serve'); - if (isServing) { - // watch only files if we are serving - const watcher = fs.watch('src/styles', (event, filepath) => { - console.log('Styles file changed', filepath); - compileSass(); - }); - - process.on('SIGINT', () => { - console.log('Stopping file watcher...'); - watcher.close(); - }); - - process.on('SIGTERM', () => { - console.log('Stopping file watcher...'); - watcher.close(); - }); - } - compileSass(); - + eleventyConfig.addPassthroughCopy('src/css'); eleventyConfig.addPassthroughCopy({ - './node_modules/@fortawesome/fontawesome-free': 'css/fontawesome', + './node_modules/@picocss/pico/css/pico.min.css': 'css/pico.min.css', }); eleventyConfig.addPassthroughCopy('src/CNAME'); eleventyConfig.addPassthroughCopy('src/images'); @@ -66,17 +42,7 @@ module.exports = function (eleventyConfig) { return collectionApi.getFilteredByGlob('src/projects/**/*.md').reverse(); }); - eleventyConfig.addPlugin(syntaxhighlight, { - init: function ({ Prism }) { - Prism.plugins.customClass.map({ - // prefix tag and number to avoid conflicts with Bulma - tag: 'prism-tag', - number: 'prism-number', - }); - }, - }); - - eleventyConfig.addFilter('coverImage', filterCoverImage); + eleventyConfig.addPlugin(syntaxhighlight); /** * Generates a dynamic cover image @@ -132,13 +98,6 @@ module.exports = function (eleventyConfig) { }; }; -async function compileSass() { - console.log('Compiling sass.'); - const cssContent = sass.compile('src/styles/main.scss'); - fs.mkdirSync('_site/css', { recursive: true }); - fs.writeFileSync('_site/css/main.css', cssContent.css); -} - function shortcodeDynamicImageOnHover( page, staticCoverImage, @@ -159,16 +118,14 @@ function shortcodeDynamicImageOnHover( if (fs.existsSync(dynamicCoverImageInputPath)) { // dynamic cover image exists return ( - `` + - `` + `
` + + `` + + `` + + `
` ); } else { - return ``; + return ``; } } -function filterCoverImage(page) { - // take filePathStem or pageOptions directly if it is a string (and a path) - var pageOptions = typeof pageOptions === 'string' ? page : page.filePathStem; - return path.join(path.dirname(pageOptions), page.data.coverImageName); -} + diff --git a/.github/workflows/test-and-deploy.yml b/.github/workflows/test-and-deploy.yml index d80c6ad8..fecc7698 100644 --- a/.github/workflows/test-and-deploy.yml +++ b/.github/workflows/test-and-deploy.yml @@ -9,9 +9,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v4 - name: Use Node.js 22 - uses: actions/setup-node@v6 + uses: actions/setup-node@v4 with: node-version: 24 cache: npm diff --git a/.github/workflows/test-pull-request.yml b/.github/workflows/test-pull-request.yml index 862fa562..a234b480 100644 --- a/.github/workflows/test-pull-request.yml +++ b/.github/workflows/test-pull-request.yml @@ -9,9 +9,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v4 - name: Use Node.js 22 - uses: actions/setup-node@v6 + uses: actions/setup-node@v4 with: node-version: 24 cache: npm diff --git a/CHANGELOG.md b/CHANGELOG.md index d24f8791..99ac6299 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 3.0.0 + +- Replace Bulma CSS framework with Pico CSS for semantic, classless styling +- Remove Sass build pipeline in favor of static CSS passthrough +- Switch project display from card grid to list layout with cover images +- Remove Font Awesome dependency; use plain text for icons +- Simplify homepage to blog-focused layout with nav-based navigation + ## 2.7.0 - Upgrade eleventy to version 3 diff --git a/package-lock.json b/package-lock.json index 8decb0a0..cd0cac68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "kleinprojects-website", - "version": "2.7.0", + "version": "3.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "kleinprojects-website", - "version": "2.7.0", + "version": "3.0.0", "license": "CC-BY-3.0", "dependencies": { "striptags": "^3.2.0" @@ -15,15 +15,13 @@ "@11ty/eleventy": "^3.1.2", "@11ty/eleventy-plugin-rss": "^3.0.0", "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0", - "@fortawesome/fontawesome-free": "^7.2.0", + "@picocss/pico": "^2.1.1", "@playwright/test": "^1.39.0", "@types/node": "^24.5.2", - "bulma": "^1.0.0", "gh-pages": "^6.0.0", "markdown-it-anchor": "^9.0.0", "moment": "^2.29.4", - "npm-check-updates": "^22.2.1", - "sass": "^1.69.3" + "npm-check-updates": "^22.2.1" } }, "node_modules/@11ty/dependency-tree": { @@ -293,16 +291,6 @@ "node": ">=18" } }, - "node_modules/@fortawesome/fontawesome-free": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.2.0.tgz", - "integrity": "sha512-3DguDv/oUE+7vjMeTSOjCSG+KeawgVQOHrKRnvUuqYh1mfArrh7s+s8hXW3e4RerBA1+Wh+hBqf8sJNpqNrBWg==", - "dev": true, - "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", - "engines": { - "node": ">=6" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -338,301 +326,12 @@ "node": ">= 8" } }, - "node_modules/@parcel/watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", - "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.0", - "@parcel/watcher-darwin-arm64": "2.5.0", - "@parcel/watcher-darwin-x64": "2.5.0", - "@parcel/watcher-freebsd-x64": "2.5.0", - "@parcel/watcher-linux-arm-glibc": "2.5.0", - "@parcel/watcher-linux-arm-musl": "2.5.0", - "@parcel/watcher-linux-arm64-glibc": "2.5.0", - "@parcel/watcher-linux-arm64-musl": "2.5.0", - "@parcel/watcher-linux-x64-glibc": "2.5.0", - "@parcel/watcher-linux-x64-musl": "2.5.0", - "@parcel/watcher-win32-arm64": "2.5.0", - "@parcel/watcher-win32-ia32": "2.5.0", - "@parcel/watcher-win32-x64": "2.5.0" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", - "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", - "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", - "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", - "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", - "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", - "cpu": [ - "x64" - ], + "node_modules/@picocss/pico": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@picocss/pico/-/pico-2.1.1.tgz", + "integrity": "sha512-kIDugA7Ps4U+2BHxiNHmvgPIQDWPDU4IeU6TNRdvXQM1uZX+FibqDQT2xUOnnO2yq/LUHcwnGlu1hvf4KfXnMg==", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } + "license": "MIT" }, "node_modules/@playwright/test": { "version": "1.60.0", @@ -870,13 +569,6 @@ "node": ">=8" } }, - "node_modules/bulma": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bulma/-/bulma-1.0.4.tgz", - "integrity": "sha512-Ffb6YGXDiZYX3cqvSbHWqQ8+LkX6tVoTcZuVB3lm93sbAVXlO0D6QlOTMnV6g18gILpAXqkG2z9hf9z4hCjz2g==", - "dev": true, - "license": "MIT" - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -959,19 +651,6 @@ "node": ">=4" } }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1454,13 +1133,6 @@ "node": ">= 4" } }, - "node_modules/immutable": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", - "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", - "dev": true, - "license": "MIT" - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -1851,13 +1523,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, - "optional": true - }, "node_modules/node-retrieve-globals": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/node-retrieve-globals/-/node-retrieve-globals-6.0.1.tgz", @@ -2262,57 +1927,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/sass": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.100.0.tgz", - "integrity": "sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^5.0.0", - "immutable": "^5.1.5", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=20.19.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/sass/node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/sass/node_modules/readdirp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", - "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/section-matter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", @@ -2392,15 +2006,6 @@ "node": ">=8.0.0" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", diff --git a/package.json b/package.json index cfcfa2f8..78fc2d1e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "kleinprojects-website", - "version": "2.7.0", + "version": "3.0.0", "description": "Landing page of Kleinprojects with blog and projects", "dependencies": { "striptags": "^3.2.0" @@ -9,15 +9,13 @@ "@11ty/eleventy": "^3.1.2", "@11ty/eleventy-plugin-rss": "^3.0.0", "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.0", - "@fortawesome/fontawesome-free": "^7.2.0", + "@picocss/pico": "^2.1.1", "@playwright/test": "^1.39.0", "@types/node": "^24.5.2", - "bulma": "^1.0.0", "gh-pages": "^6.0.0", "markdown-it-anchor": "^9.0.0", "moment": "^2.29.4", - "npm-check-updates": "^22.2.1", - "sass": "^1.69.3" + "npm-check-updates": "^22.2.1" }, "scripts": { "start": "eleventy --serve", diff --git a/src/_includes/page.njk b/src/_includes/page.njk index ce63555f..7dd4eb75 100644 --- a/src/_includes/page.njk +++ b/src/_includes/page.njk @@ -1,11 +1,9 @@ --- navParent: home useHero: true -addSection: true title: null subtitle: null date: null -centerContent: true --- {% include 'partials/_header.njk' %} @@ -14,13 +12,10 @@ centerContent: true {% include 'partials/_hero.njk' %} {% else %} {% include 'partials/_navbar.njk' %} - {% include 'partials/_section.njk' %} {% endif %} -
-
- {{ content | safe }} -
+
+ {{ content | safe }}
{% include 'partials/_footer.njk' %} diff --git a/src/_includes/partials/_footer.njk b/src/_includes/partials/_footer.njk index 4957cdcb..ec4c1520 100644 --- a/src/_includes/partials/_footer.njk +++ b/src/_includes/partials/_footer.njk @@ -1,6 +1,7 @@ - \ No newline at end of file + +

+ diff --git a/src/_includes/partials/_header.njk b/src/_includes/partials/_header.njk index 9a27b986..ae3d7bc9 100644 --- a/src/_includes/partials/_header.njk +++ b/src/_includes/partials/_header.njk @@ -3,12 +3,14 @@ - - - + + + + + - + {{ pageTitle }} - + - \ No newline at end of file + diff --git a/src/_includes/partials/_hero.njk b/src/_includes/partials/_hero.njk index b684719d..9f536289 100644 --- a/src/_includes/partials/_hero.njk +++ b/src/_includes/partials/_hero.njk @@ -1,12 +1,12 @@ -
-
- {% include "partials/_navbar.njk" %} +
+ {% include "partials/_navbar.njk" %} +
+
+

{{ title }}

+

{{ subtitle }}

+ {% if date %} +

{{ date | formatDate }}

+ {% endif %} +
-
-

{{ title }}

-

{{ subtitle }}

- {% if date %} -
{{ date | formatDate}}
- {% endif %} -
-
\ No newline at end of file + diff --git a/src/_includes/partials/_navbar.njk b/src/_includes/partials/_navbar.njk index 7757ec76..90e38a21 100644 --- a/src/_includes/partials/_navbar.njk +++ b/src/_includes/partials/_navbar.njk @@ -1,16 +1,13 @@ - \ No newline at end of file + + + + diff --git a/src/_includes/partials/_section.njk b/src/_includes/partials/_section.njk deleted file mode 100644 index af4206e6..00000000 --- a/src/_includes/partials/_section.njk +++ /dev/null @@ -1,8 +0,0 @@ -
- {% if title %} -

{{ title }}

- {% endif %} - {% if subtitle %} -

{{ subtitle }}

- {% endif %} -
\ No newline at end of file diff --git a/src/_includes/post.njk b/src/_includes/post.njk index 15cb0976..b300d55b 100644 --- a/src/_includes/post.njk +++ b/src/_includes/post.njk @@ -1,14 +1,19 @@ --- navParent: blog permalink: /{{title | slugify}}/index.html -layout: page -centerContent: false +layout: page.njk +useHero: false title: null subtitle: null --- -{# Base layout for posts in `posts` folder. #} -
+
+
+

{{ title }}

+ {% if date %} +

+ {% endif %} +
{{ content | safe }} -
+ diff --git a/src/_includes/projects/card.njk b/src/_includes/projects/card.njk deleted file mode 100644 index 96111990..00000000 --- a/src/_includes/projects/card.njk +++ /dev/null @@ -1,65 +0,0 @@ -
-
-
- {% dynamicImageOnHover project, project.data.coverImage, project.data.coverImageDynamic %} -
-
-
- -
- - - - -
- {% if project.data.platforms %} - {% if 'desktop' in project.data.platforms %} -
- - - - Desktop -
- {% endif %} - {% if 'mobile' in project.data.platforms %} -
- - - - Mobile -
- {% endif %} - {% endif %} -
-

{{ project.data.title }}

-

{{ project.data.description }} -

-
- -
\ No newline at end of file diff --git a/src/_includes/projects/cards-grid.njk b/src/_includes/projects/cards-grid.njk deleted file mode 100644 index 30cacccb..00000000 --- a/src/_includes/projects/cards-grid.njk +++ /dev/null @@ -1,7 +0,0 @@ -
- {% for project in collections.projects %} -
- {% include 'projects/card.njk' %} -
- {% endfor %} -
diff --git a/src/_includes/projects/list-item.njk b/src/_includes/projects/list-item.njk new file mode 100644 index 00000000..dc466053 --- /dev/null +++ b/src/_includes/projects/list-item.njk @@ -0,0 +1,36 @@ +
+ {% if project.data.coverImage %} +
+ {% dynamicImageOnHover project, project.data.coverImage, project.data.coverImageDynamic %} +
+ {% endif %} +

+ {{ project.data.title }} +

+

+ + {% if project.data.platforms %} + · + {% if 'desktop' in project.data.platforms %}Desktop{% endif %} + {% if 'desktop' in project.data.platforms and 'mobile' in project.data.platforms %}, {% endif %} + {% if 'mobile' in project.data.platforms %}Mobile{% endif %} + {% endif %} +

+

{{ project.data.description }}

+
+ {% if project.data.sourceUrl %} + {{ project.data.sourceUrlText or 'GitHub' }} + {% endif %} + {% if project.data.projectUrl %} + {% if project.data.sourceUrl %} · {% endif %} + {{ project.data.projectUrlText }} + {% endif %} + {% if project.data.urls.length %} + {% if project.data.sourceUrl or project.data.projectUrl %} · {% endif %} + {% for url in project.data.urls | reverse %} + {% if not loop.first %} · {% endif %} + {{ url.text }} + {% endfor %} + {% endif %} +
+
diff --git a/src/blog.njk b/src/blog.njk index 41c909ad..191bc662 100644 --- a/src/blog.njk +++ b/src/blog.njk @@ -5,14 +5,9 @@ title: Blog --- {%- for post in collections.posts -%} -

- - {{ post.data.title }} -
- {{ post.data.tags.join(', ') }} - · {{ post.data.date | formatDate }} -

- {{ post.content | excerpt }} -

-

-{%- endfor -%} \ No newline at end of file +
+

{{ post.data.title }}

+

{{ post.data.tags.join(', ') }} · {{ post.data.date | formatDate }}

+

{{ post.content | excerpt }}

+
+{%- endfor -%} diff --git a/src/css/custom.css b/src/css/custom.css new file mode 100644 index 00000000..560005f9 --- /dev/null +++ b/src/css/custom.css @@ -0,0 +1,52 @@ +.float-right { + float: right; +} + +.responsive-image { + width: 100%; +} + +@media only screen and (min-width: 601px) and (max-width: 1024px) { + .responsive-image { + width: 70%; + } +} + +@media only screen and (min-width: 1025px) { + .responsive-image { + width: 70%; + max-width: 800px; + } +} + +/* Active nav link styling */ +nav a[aria-current="page"] { + text-decoration: underline; + text-underline-offset: 0.3em; +} + +/* Dynamic image hover for project cards */ +.project-card { + position: relative; +} + +.project-card .is-absolute { + position: absolute; + top: 0; + left: 0; + opacity: 0; +} + +.project-card:hover .is-absolute { + opacity: 1; +} + +.project-card:hover .is-hidden-on-hover { + opacity: 0; +} + +/* Ensure list item images don't overflow */ +article header .project-card { + max-height: 300px; + overflow: hidden; +} diff --git a/src/styles/prism-theme.scss b/src/css/prism-theme.css similarity index 91% rename from src/styles/prism-theme.scss rename to src/css/prism-theme.css index e9073f81..f871830c 100644 --- a/src/styles/prism-theme.scss +++ b/src/css/prism-theme.css @@ -49,8 +49,8 @@ pre[class*='language-'] { padding: 1em; margin: 0.5em 0; overflow: auto; - border: 1px solid var(--bulma-border); - background-color: var(--bulma-code-background); + border: 1px solid #ddd; + background-color: #f5f5f5; } /* Inline code */ @@ -58,8 +58,8 @@ pre[class*='language-'] { padding: 0.2em; padding-top: 1px; padding-bottom: 1px; - background: var(--bulma-code-background); - border: 1px solid var(--bulma-border); + background: #f5f5f5; + border: 1px solid #ddd; } .token.comment, @@ -85,7 +85,7 @@ pre[class*='language-'] { .token.url, .token.symbol, -.token.prism-number, +.token.number, .token.boolean, .token.variable, .token.constant, @@ -98,7 +98,7 @@ pre[class*='language-'] { .token.attr-value, .language-autohotkey .token.selector, .language-json .token.boolean, -.language-json .token.prism-number, +.language-json .token.number, code[class*='language-css'] { color: #0000ff; } @@ -108,7 +108,7 @@ code[class*='language-css'] { } .token.deleted, -.language-autohotkey .token.prism-tag { +.language-autohotkey .token.tag { color: #9a050f; } @@ -131,7 +131,7 @@ code[class*='language-css'] { color: #2b91af; } -.token.prism-tag, +.token.tag, .token.selector { color: #800000; } @@ -143,7 +143,7 @@ code[class*='language-css'] { color: #ff0000; } -.token.directive.prism-tag .prism-tag { +.token.directive.tag .tag { background: #ffff00; color: #393a34; } @@ -228,7 +228,7 @@ code[class*='language-css'] { .token.url, .token.symbol, - .token.prism-number, + .token.number, .token.boolean, .token.variable, .token.constant, @@ -241,7 +241,7 @@ code[class*='language-css'] { .token.attr-value, .language-autohotkey .token.selector, .language-json .token.boolean, - .language-json .token.prism-number, + .language-json .token.number, code[class*='language-css'] { color: #569cd6; } @@ -251,7 +251,7 @@ code[class*='language-css'] { } .token.deleted, - .language-autohotkey .token.prism-tag { + .language-autohotkey .token.tag { color: #f48771; } @@ -265,7 +265,7 @@ code[class*='language-css'] { color: #4ec9b0; } - .token.prism-tag, + .token.tag, .token.selector { color: #569cd6; } @@ -277,7 +277,7 @@ code[class*='language-css'] { color: #9cdcfe; } - .token.directive.prism-tag .prism-tag { + .token.directive.tag .tag { background: #646695; color: #d4d4d4; } diff --git a/src/index.njk b/src/index.njk index 8a4990d7..1c07118c 100644 --- a/src/index.njk +++ b/src/index.njk @@ -5,30 +5,9 @@ title: Kleinprojects subtitle: coding projects and blog --- -
-
-

Latest Project

- {% set project = collections.projects | first %} - {% include 'projects/card.njk' %} - - Explore Projects - -
-
-

Latest Posts

-
- {%- for post in collections.posts -%} -

- - {{ post.data.title }} -
- {{ post.data.tags.join(', ') }} - · {{ post.data.date | formatDate }} -

- {%- endfor -%} -
- - Explore Posts - -
-
\ No newline at end of file +{%- for post in collections.posts -%} +
+

{{ post.data.title }}

+

{{ post.data.tags.join(', ') }} · {{ post.data.date | formatDate }}

+
+{%- endfor -%} diff --git a/src/projects.njk b/src/projects.njk index faca6008..e4b25588 100644 --- a/src/projects.njk +++ b/src/projects.njk @@ -4,4 +4,6 @@ navParent: projects title: Coding Projects --- -{% include 'projects/cards-grid.njk' %} \ No newline at end of file +{% for project in collections.projects %} + {% include 'projects/list-item.njk' %} +{% endfor %} diff --git a/src/styles/bulma.scss b/src/styles/bulma.scss deleted file mode 100644 index e28b44f7..00000000 --- a/src/styles/bulma.scss +++ /dev/null @@ -1,11 +0,0 @@ -@charset "utf-8"; - -@use "../../node_modules//bulma/sass/utilities/initial-variables" as iv; -@use "../../node_modules/bulma/sass" with ( -// $navbar-breakpoint: iv.$tablet - $navbar-breakpoint: 0 -); - -.is-absolute { - position: absolute; -} diff --git a/src/styles/custom.scss b/src/styles/custom.scss deleted file mode 100644 index cfdc54eb..00000000 --- a/src/styles/custom.scss +++ /dev/null @@ -1,29 +0,0 @@ -.float-right { - float: right; -} - -.responsive-image { - width: 100%; -} - -@media only screen and (max-width: 600px) { - .responsive-image { - width: 100%; - } -} - -/* Styles for medium screens */ -@media only screen and (min-width: 601px) and (max-width: 1024px) { - .responsive-image { - width: 70%; - /* max-width: 800px; */ - } -} - -/* Styles for large screens */ -@media only screen and (min-width: 1025px) { - .responsive-image { - width: 70%; - max-width: 800px; - } -} \ No newline at end of file diff --git a/src/styles/main.scss b/src/styles/main.scss deleted file mode 100644 index 3b386d8c..00000000 --- a/src/styles/main.scss +++ /dev/null @@ -1,7 +0,0 @@ -@charset "utf-8"; - -@use './bulma.scss'; - -@use './prism-theme.scss'; - -@use './custom.scss'; \ No newline at end of file diff --git a/test/e2e.test.ts b/test/e2e.test.ts index b8e6371f..d99554ab 100644 --- a/test/e2e.test.ts +++ b/test/e2e.test.ts @@ -3,7 +3,7 @@ import { test, expect } from '@playwright/test'; test('test', async ({ page, baseURL }) => { await page.goto('/'); - await page.getByRole('link', { name: 'Kleinprojects' }).click(); + await page.getByRole('link', { name: 'Home' }).click(); await expect(page).toHaveURL('/'); await page.getByRole('link', { name: 'Projects', exact: true }).click();