From f8f9d3eb20905c136efa5f9a0278853262dd5656 Mon Sep 17 00:00:00 2001 From: Ben Aultowski Date: Fri, 26 Dec 2025 16:37:29 -0500 Subject: [PATCH] =?UTF-8?q?Resurrected=20from=20the=20basement=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- eleventy.config.js | 7 + package-lock.json | 24 +- package.json | 15 +- src/_config/events.js | 4 +- src/_config/events/build-pagefind-index.js | 13 + src/_config/plugins.js | 2 + src/_data/meta.js | 20 +- src/_data/navigation.js | 28 +- src/_layouts/post.njk | 2 +- src/assets/css/global/blocks/search.css | 255 ++++++++++++++++++ src/assets/css/local/search.css | 33 +++ .../og-images/gasheyes-creek-preview.jpeg | Bin 0 -> 29863 bytes src/assets/scripts/bundle/search.js | 226 ++++++++++++++++ src/assets/svg/divider/layeredwaves.svg | 9 + src/assets/svg/divider/spikes.svg | 9 + src/assets/svg/divider/triangle.svg | 9 + src/assets/svg/misc/logo.svg | 29 +- src/common/tagList.njk | 3 + src/pages/about.md | 22 +- src/pages/search.njk | 44 +++ src/pages/stories.njk | 23 ++ src/pages/thoughts.njk | 42 +++ src/posts/2025/2025-11-11-gasheyes-creek.md | 11 + 23 files changed, 762 insertions(+), 68 deletions(-) create mode 100644 src/_config/events/build-pagefind-index.js create mode 100644 src/assets/css/global/blocks/search.css create mode 100644 src/assets/css/local/search.css create mode 100644 src/assets/og-images/gasheyes-creek-preview.jpeg create mode 100644 src/assets/scripts/bundle/search.js create mode 100644 src/assets/svg/divider/layeredwaves.svg create mode 100644 src/assets/svg/divider/spikes.svg create mode 100644 src/assets/svg/divider/triangle.svg create mode 100644 src/pages/search.njk create mode 100644 src/pages/stories.njk create mode 100644 src/pages/thoughts.njk create mode 100644 src/posts/2025/2025-11-11-gasheyes-creek.md diff --git a/eleventy.config.js b/eleventy.config.js index 91bc1a0..b6d5e7f 100644 --- a/eleventy.config.js +++ b/eleventy.config.js @@ -69,6 +69,8 @@ export default async function (eleventyConfig) { } }); + eleventyConfig.addPlugin(plugins.EleventyNavigationPlugin); + // --------------------- bundle eleventyConfig.addBundle('css', {hoist: true}); @@ -117,6 +119,11 @@ export default async function (eleventyConfig) { eleventyConfig.on('eleventy.after', events.svgToJpeg); } + // Pagefind search index + if (process.env.ELEVENTY_RUN_MODE === 'build') { + eleventyConfig.on('eleventy.after', events.buildPagefind); + } + // --------------------- Passthrough File Copy // -- same path diff --git a/package-lock.json b/package-lock.json index 4dda91c..9496630 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,18 @@ { - "name": "eleventy-excellent", - "version": "4.5.0", + "name": "hypnagaga", + "version": "0.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "eleventy-excellent", - "version": "4.5.0", + "name": "hypnagaga", + "version": "0.0.1", "license": "ISC", "dependencies": { "@11ty/eleventy": "^3.1.2", "@11ty/eleventy-fetch": "^5.1.0", "@11ty/eleventy-img": "^6.0.4", + "@11ty/eleventy-navigation": "^1.0.4", "@11ty/eleventy-plugin-rss": "^2.0.4", "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.2", "@11ty/eleventy-plugin-webc": "^0.11.2", @@ -42,6 +43,7 @@ "markdown-it-prism": "^3.0.1", "netlify-plugin-cache": "^1.0.3", "pa11y-ci": "^4.0.1", + "pagefind": "^1.4.0", "postcss": "^8.5.6", "postcss-cli": "^11.0.1", "postcss-import": "^16.1.1", @@ -604,6 +606,19 @@ "@img/sharp-win32-x64": "0.33.5" } }, + "node_modules/@11ty/eleventy-navigation": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-navigation/-/eleventy-navigation-1.0.5.tgz", + "integrity": "sha512-zb6xe29cM9viSdYtZywKIkJw2HIROyBINdBcFWC9uD0c/jYOTAex5nwy3HNEuh5t6/Ld/S9V4gEizfmeYuYpCQ==", + "license": "MIT", + "dependencies": { + "dependency-graph": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, "node_modules/@11ty/eleventy-plugin-bundle": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-bundle/-/eleventy-plugin-bundle-3.0.7.tgz", @@ -2786,7 +2801,6 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "license": "MIT", - "peer": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", diff --git a/package.json b/package.json index 7c4791e..24a9c62 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { - "name": "eleventy-excellent", - "version": "4.5.0", - "description": "Eleventy starter built around the workflow suggested by Andy Bell's buildexcellentwebsit.es.", - "author": "Lene Saile", + "name": "hypnagaga", + "version": "0.0.1", + "description": "A web site.", + "author": "Ben Aultowski", "license": "ISC", "type": "module", "engines": { @@ -16,8 +16,9 @@ "screenshots": "node ./src/_config/setup/generate-screenshots.js", "dev:11ty": "cross-env ELEVENTY_ENV=development eleventy --serve", "build:11ty": "cross-env ELEVENTY_ENV=production eleventy", + "build:search": "pagefind --site 'dist' --glob '**/*.html'", "start": "npm run dev:11ty", - "build": "npm run clean && npm run build:11ty", + "build": "npm run clean && npm run build:11ty && npm run build:search", "pa11y:build": "npm run clean && cross-env ELEVENTY_ENV=test eleventy", "pa11y:test": "sleep 3 && pa11y-ci --config ./dist/pa11y.json", "pa11y:serve": "ELEVENTY_ENV=test eleventy --serve --ignore-initial", @@ -26,12 +27,13 @@ "keywords": [], "repository": { "type": "git", - "url": "https://github.com/madrilene/eleventy-excellent.git" + "url": "https://git.hypnagaga.com/wires/hypnagaga.git" }, "dependencies": { "@11ty/eleventy": "^3.1.2", "@11ty/eleventy-fetch": "^5.1.0", "@11ty/eleventy-img": "^6.0.4", + "@11ty/eleventy-navigation": "^1.0.4", "@11ty/eleventy-plugin-rss": "^2.0.4", "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.2", "@11ty/eleventy-plugin-webc": "^0.11.2", @@ -62,6 +64,7 @@ "markdown-it-prism": "^3.0.1", "netlify-plugin-cache": "^1.0.3", "pa11y-ci": "^4.0.1", + "pagefind": "^1.4.0", "postcss": "^8.5.6", "postcss-cli": "^11.0.1", "postcss-import": "^16.1.1", diff --git a/src/_config/events.js b/src/_config/events.js index 21b012e..aace2e9 100644 --- a/src/_config/events.js +++ b/src/_config/events.js @@ -1,9 +1,11 @@ import {svgToJpeg} from './events/svg-to-jpeg.js'; import {buildAllCss} from './events/build-css.js'; import {buildAllJs} from './events/build-js.js'; +import {buildPagefind} from './events/build-pagefind-index.js'; export default { svgToJpeg, buildAllCss, - buildAllJs + buildAllJs, + buildPagefind }; diff --git a/src/_config/events/build-pagefind-index.js b/src/_config/events/build-pagefind-index.js new file mode 100644 index 0000000..c998a7b --- /dev/null +++ b/src/_config/events/build-pagefind-index.js @@ -0,0 +1,13 @@ +import {execSync} from 'node:child_process'; + +export const buildPagefind = () => { + console.log('Building Pagefind index...'); + try { + execSync(`npx pagefind --site dist --glob "**/*.html"`, { + encoding: 'utf-8', + stdio: 'inherit' + }); + } catch (error) { + console.error('Pagefind build failed: ', error.message); + } +}; \ No newline at end of file diff --git a/src/_config/plugins.js b/src/_config/plugins.js index 50f54be..03d2d42 100644 --- a/src/_config/plugins.js +++ b/src/_config/plugins.js @@ -4,6 +4,7 @@ import rss from '@11ty/eleventy-plugin-rss'; import syntaxHighlight from '@11ty/eleventy-plugin-syntaxhighlight'; import webc from '@11ty/eleventy-plugin-webc'; import {eleventyImageTransformPlugin} from '@11ty/eleventy-img'; +import EleventyNavigationPlugin from '@11ty/eleventy-navigation'; // custom import {markdownLib} from './plugins/markdown.js'; @@ -18,6 +19,7 @@ export default { syntaxHighlight, webc, eleventyImageTransformPlugin, + EleventyNavigationPlugin, markdownLib, drafts, htmlConfig diff --git a/src/_data/meta.js b/src/_data/meta.js index bcf31f4..4906d93 100644 --- a/src/_data/meta.js +++ b/src/_data/meta.js @@ -1,24 +1,24 @@ export const url = process.env.URL || 'http://localhost:8080'; // Extract domain from `url` export const domain = new URL(url).hostname; -export const siteName = 'Eleventy Excellent'; -export const siteDescription = 'Eleventy starter for building modern, resilient websites'; +export const siteName = 'Hypnagaga'; +export const siteDescription = 'A vision quest.'; export const siteType = 'Person'; // schema export const locale = 'en_EN'; export const lang = 'en'; export const skipContent = 'Skip to content'; export const author = { - name: 'Lene Saile', // i.e. Lene Saile - page / blog author's name. Must be set. + name: 'Ben Aultowski', avatar: '/icon-512x512.png', // path to the author's avatar. In this case just using a favicon. - email: 'hola@lenesaile.com', // i.e. hola@lenesaile.com - email of the author - website: 'https://www.lenesaile.com', // i.e. https.://www.lenesaile.com - the personal site of the author - fediverse: '@lene@front-end.social' // used for highlighting journalism on the fediverse. Can be Mastodon, Flipboard, Threads, WordPress (with the ActivityPub plugin installed), PeerTube, Pixelfed, etc. https://blog.joinmastodon.org/2024/07/highlighting-journalism-on-mastodon/ + email: 'benaultowski@proton.me', + website: 'https://www.hypnagaga.com', + fediverse: '' // used for highlighting journalism on the fediverse. Can be Mastodon, Flipboard, Threads, WordPress (with the ActivityPub plugin installed), PeerTube, Pixelfed, etc. https://blog.joinmastodon.org/2024/07/highlighting-journalism-on-mastodon/ }; export const creator = { - name: 'Lene Saile', // i.e. Lene Saile - creator's (developer) name. - email: 'hola@lenesaile.com', - website: 'https://www.lenesaile.com', - social: 'https://front-end.social/@lene' + name: 'Ben Aultowski', // i.e. Lene Saile - creator's (developer) name. + email: 'benaultowski@proton.me', + website: 'https://www.hypnagaga.com', + social: '' }; export const pathToSvgLogo = 'src/assets/svg/misc/logo.svg'; // used for favicon generation export const themeColor = '#dd4462'; // used in manifest, for example primary color value diff --git a/src/_data/navigation.js b/src/_data/navigation.js index 7c8a257..ebb405a 100644 --- a/src/_data/navigation.js +++ b/src/_data/navigation.js @@ -1,38 +1,26 @@ export default { top: [ { - text: 'About', - url: '/about/' + text: 'Why', + url: '/why/' }, { - text: 'Docs', - url: '/get-started/' + text: 'Thoughts', + url: '/thoughts/' }, { - text: 'Built with', - url: '/built-with/' + text: 'Stories', + url: '/stories/' }, { - text: 'Blog', - url: '/blog/' + text: 'Search', + url: '/search/' } ], bottom: [ { text: 'Style guide', url: '/styleguide/' - }, - { - text: 'Imprint', - url: '/imprint/' - }, - { - text: 'Privacy', - url: '/privacy/' - }, - { - text: 'Accessibility', - url: '/accessibility/' } ] }; diff --git a/src/_layouts/post.njk b/src/_layouts/post.njk index 42b9c51..c1653dd 100644 --- a/src/_layouts/post.njk +++ b/src/_layouts/post.njk @@ -25,7 +25,7 @@ schema: BlogPosting %} {% for tag in tags %}{% if tag != "posts" %} - {{ tag }} + {{ tag }} {% endif %}{% endfor %} {% endif %}

diff --git a/src/assets/css/global/blocks/search.css b/src/assets/css/global/blocks/search.css new file mode 100644 index 0000000..fe8376f --- /dev/null +++ b/src/assets/css/global/blocks/search.css @@ -0,0 +1,255 @@ +/*============================================= += Search Form = +=============================================*/ + +.search-form { + display: flex; + gap: var(--space-xs); +} + +.search-form__input { + flex-grow: 1; + padding: var(--space-xs) var(--space-s); + border: 1px solid var(--color-primary); + border-radius: var(--rounded); + font-size: var(--text-base); + background-color: var(--color-bg); + color: var(--color-text); +} + +.search-form__input:focus { + outline: 2px solid var(--color-secondary); + outline-offset: 2px; +} + +.search-form__button { + padding: var(--space-xs) var(--space-s); + border: 1px solid var(--color-primary); + border-radius: var(--rounded); + background-color: var(--color-primary); + color: var(--color-bg); + cursor: pointer; + font-size: var(--text-base); +} + +.search-form__button:hover { + background-color: var(--color-secondary); +} + +/*============================================= += Search Results = +=============================================*/ + +.search-results-summary { + margin-block-end: var(--space-l); + font-size: var(--text-l); + font-weight: var(--font-bold); +} + +.search-results-list { + list-style: none; + padding: 0; + margin: 0; + display: grid; + gap: var(--space-l); +} + +.search-result { + padding: var(--space-m); + border: 1px solid var(--color-bg-accent); + border-radius: var(--rounded-lg); + background-color: var(--color-bg-accent); +} + +.search-result__title { + margin-block-start: 0; + margin-block-end: var(--space-xs); + font-size: var(--text-xl); +} + +.search-result__title a { + text-decoration: none; + color: var(--color-primary); +} + +.search-result__title a:hover { + text-decoration: underline; +} + +.search-result__excerpt { + margin: 0; +} + +.search-results-list custom-card p mark { + background-color: var(--color-highlight); + color: var(--color-text); + padding: 0.1em 0.2em; + border-radius: var(--rounded-sm); +} + +/*============================================= += Search Filters = +=============================================*/ + +#custom-search-filters { + margin-block-start: var(--space-l); + padding: var(--space-m); + border: 1px solid var(--color-bg-accent); + border-radius: var(--rounded-lg); + background-color: var(--color-bg-accent); +} + +#custom-search-filters h3 { + margin-block-start: 0; + margin-block-end: var(--space-m); + font-size: var(--text-l); + font-weight: var(--font-bold); +} + +.filter-group { + display: flex; + flex-wrap: wrap; + gap: var(--space-s); +} + +.filter-group label { + display: flex; + align-items: center; + gap: var(--space-xs); + padding: var(--space-xs) var(--space-s); + border: 1px solid var(--color-bg-accent); + border-radius: var(--rounded); + cursor: pointer; + user-select: none; + transition: background-color 0.2s ease; +} + +.filter-group label:hover { + background-color: var(--color-bg-accent); +} + +.filter-group input[type="checkbox"] { + /* Hide the default checkbox */ + appearance: none; + -webkit-appearance: none; + width: 1em; + height: 1em; + border: 1px solid var(--color-primary); + border-radius: var(--rounded-sm); + vertical-align: middle; + position: relative; +} + +.filter-group input[type="checkbox"]:checked { + background-color: var(--color-primary); +} + +.filter-group input[type="checkbox"]:checked::after { + content: '✔'; + color: var(--color-bg); + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 0.8em; + line-height: 1; +} + +/*============================================= += Search Result Cards (custom-card styling) = +=============================================*/ + +.search-results-list custom-card { + --gutter: var(--space-xs-s); + background-color: var(--card-bg, var(--color-bg-accent)); + border: 4px solid var(--color-bg-accent); + color: var(--color-text); + padding: var(--space-s-m); + border-radius: var(--border-radius-medium); + max-inline-size: unset; + display: grid; + grid-template-rows: [image] max-content [headline] max-content [meta] max-content [desc] auto [footer] max-content; + position: relative; + text-decoration: none; + transition: border-color 0.2s ease; +} + +/* avoid flow space being added to unused elements */ +.search-results-list custom-card > :empty { + display: none; +} + +.search-results-list custom-card ::selection { + color: var(--color-dark); + background-color: var(--color-secondary); +} + +.search-results-list custom-card :is(h2, h3) { + --flow-space: var(--space-m); + grid-row: headline; +} + +.search-results-list custom-card :is(h2, h3) a { + text-decoration: none; +} + +.search-results-list custom-card > :is(picture, figure) { + grid-row: image; + --flow-space: 0; +} + +.search-results-list custom-card img { + width: 100%; + height: 200px; + object-fit: cover; + object-position: center; +} + +.search-results-list custom-card > .meta { + grid-row: meta; + font-size: var(--size-step-min-1); +} + +.search-results-list custom-card > p { + grid-row: desc; +} + +.search-results-list custom-card > footer { + grid-row: footer; + font-size: var(--size-step-min-2); +} + +/* avoid overflow of long words */ +.search-results-list custom-card :is(a, p, h2, h3) { + overflow-wrap: break-word; + word-wrap: break-word; + word-break: break-word; +} + +/* squared image variant */ +.search-results-list custom-card[img-square] img { + aspect-ratio: 1; +} + +/* clickable variant */ +.search-results-list custom-card[clickable]:hover, +.search-results-list custom-card[clickable]:focus-within { + border: 4px solid var(--color-primary); +} + +.search-results-list custom-card[clickable]:focus-within a:focus { + outline: none; +} + +.search-results-list custom-card[clickable] { + position: relative; +} + +.search-results-list custom-card[clickable] a:after { + bottom: 0; + content: ''; + left: 0; + position: absolute; + right: 0; + top: 0; +} \ No newline at end of file diff --git a/src/assets/css/local/search.css b/src/assets/css/local/search.css new file mode 100644 index 0000000..d06b285 --- /dev/null +++ b/src/assets/css/local/search.css @@ -0,0 +1,33 @@ +form#search { + .filter-and-results { + display: flex; + flex-direction: row; + + &.filter-and-results--hidden { + display: none; + } + + fieldset.types { + display: flex; + flex-direction: column; + width: fit-content; + font-size: smaller; + } + + .results-area { + padding-right: 0.7em; + } + } +} + +@media screen(ltsm) { + form#search { + .filter-and-results { + flex-direction: column; + + .results-area { + padding-right: 0; + } + } + } +} diff --git a/src/assets/og-images/gasheyes-creek-preview.jpeg b/src/assets/og-images/gasheyes-creek-preview.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..2051bb0acf5ce50250f79944361bc9338a73a66f GIT binary patch literal 29863 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 literal 0 HcmV?d00001 diff --git a/src/assets/scripts/bundle/search.js b/src/assets/scripts/bundle/search.js new file mode 100644 index 0000000..0afae0a --- /dev/null +++ b/src/assets/scripts/bundle/search.js @@ -0,0 +1,226 @@ +import dayjs from 'dayjs'; + +const allTypes = ['Page', 'Post']; + +async function ensurePagefind() { + if (window.pagefind) return Promise.resolve(window.pagefind); + return import('/pagefind/pagefind.js') + .then(function (mod) { + mod.options({ + highlightParam: 'highlight' + }); + window.pagefind = mod; + return window.pagefind || mod.pagefind || mod.default || mod; + }) + .catch(function () { + return new Promise(function (resolve) { + const s = document.createElement('script'); + s.src = '/pagefind/pagefind.js'; + s.type = 'module'; + s.onload = function () { + resolve(window.pagefind); + }; + s.onerror = function () { + resolve(undefined); + }; + document.head.appendChild(s); + }); + }); +} + +function renderItem(item) { + let { + url, + excerpt, + meta: {author, date, title, type, image, image_alt, tag} + } = item; + + //debugging + console.log(item.meta); + + // create date + const dateHTML = date ? `${dayjs(date).format('MMMM D, YYYY') }` : ''; + + // create hero image preview + let imageHTML = ''; + if (item.meta.image) { + // Try to get alt text from Pagefind metadata, fallback to title, then generic text + const altText = item.meta['image[alt]'] || item.meta.title || 'Search result image'; + imageHTML = `${altText}`; + } + +// create tags + let tagsHTML = ''; + if (item.filters && item.filters.tag && item.filters.tag.length > 0) { + tagsHTML = ` + + ${item.filters.tag.map(tag => `${tag}`).join('')} + + `; + } + + let variant; + switch (type) { + case 'Page': + variant = 'secondary'; + break; + default: + variant = 'primary'; + break; + } + + //output the search result + return ` + + ${imageHTML} +

+ ${title} +

+ ${dateHTML} +
+ ${type} ${tagsHTML} +
+
${excerpt}
+
+`; +} + +function renderItems(q, items) { + var results = items.length == 1 ? 'result' : 'results'; + document.querySelector('#results-count').innerHTML = `${items.length} ${results} for ${q}`; + + let content = items.map(renderItem).join(''); + document.querySelector('#results').innerHTML = content; +} + +function doSearch(isPopEvent = false) { + let form = document.querySelector('form#search'); + + // Clear current content + document.querySelector('#results').innerHTML = ''; + document.querySelector('#results-count').innerHTML = ''; + + // Get form data + let formData = new FormData(form); + let q = formData.get('q'); + + let types = []; + allTypes.map(possibleFilter => { + if (formData.get(possibleFilter)) { + types.push(possibleFilter); + } + }); + + let tags = []; + formData.getAll('tag').forEach(tag => { + if (tag) tags.push(tag); + }); + + // Only do a search if there's a query + if (q) { + // Update url unless it's a popstate event + if (!isPopEvent) { + setWindowLocation(q, types, tags, isPopEvent); + } + + // Show results area + form.querySelector('#filter-and-results').classList.remove('filter-and-results--hidden'); + + // Find and display results + window.pagefind + .search(q, { + filters: { + type: { any: types }, + tag: { any: tags } + } + }) + + .then(search => + Promise.all(search.results.map(result => result.data())) + .then(data => renderItems(q, data)) + .catch(console.error) + ) + .catch(console.error); + } +} + +function setWindowLocation(q, types, tags) { + const url = new URL(window.location); + if (q) { + url.searchParams.set('q', q); + } + + url.searchParams.delete('types'); + for (const type of types) { + url.searchParams.append('types', type); + } + + url.searchParams.delete('tags'); + for (const tag of tags) { + url.searchParams.append('tags', tag); + } + + + window.history.pushState({search: url.searchParams.toString()}, '', url); +} + +function setFormFromLocation() { + const url = new URL(window.location); + let searchParams = url.searchParams; + setFormFromSearchParams(searchParams); +} + +function setFormFromSearchParams(searchParams) { + let q = searchParams.get('q'); + document.querySelector('form#search input#q').value = q; + + let types = searchParams.getAll('types'); + + for (const type of allTypes) { + document.querySelector(`form#search input[name="${type}"]`).checked = types.includes(type); + } + + let tags = searchParams.getAll('tags'); + document.querySelectorAll('form#search input[name="tag"]').forEach(input => { + input.checked = tags.includes(input.value); + }); +} + +window.addEventListener('DOMContentLoaded', _ => { + ensurePagefind() + .then(_ => { + setFormFromLocation(); + doSearch(); + }) + .catch(e => console.error('page find error', e)); + + let form = document.querySelector('form#search'); + form.addEventListener('submit', e => { + e.preventDefault(); + + doSearch(); + }); + + // Submit form on post type change + let checkboxes = form.querySelectorAll('input[type="checkbox"]'); + checkboxes.forEach(checkbox => { + checkbox.addEventListener('change', _ => { + doSearch(); + }); + }); + + // Using browser back or forward button + window.addEventListener('popstate', event => { + // Only intercept if on search page + if (!['/search/', '/search'].includes(window.location.pathname)) return; + + ensurePagefind() + .then(_ => { + let searchParams = new URLSearchParams(event.state?.search ?? ''); + setFormFromSearchParams(searchParams); + // Don't update history as we're navigating through history! + doSearch(true); + }) + .catch(e => console.error('page find error', e)); + }); +}); diff --git a/src/assets/svg/divider/layeredwaves.svg b/src/assets/svg/divider/layeredwaves.svg new file mode 100644 index 0000000..a95e61c --- /dev/null +++ b/src/assets/svg/divider/layeredwaves.svg @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/src/assets/svg/divider/spikes.svg b/src/assets/svg/divider/spikes.svg new file mode 100644 index 0000000..6341e15 --- /dev/null +++ b/src/assets/svg/divider/spikes.svg @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/src/assets/svg/divider/triangle.svg b/src/assets/svg/divider/triangle.svg new file mode 100644 index 0000000..f765d03 --- /dev/null +++ b/src/assets/svg/divider/triangle.svg @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/src/assets/svg/misc/logo.svg b/src/assets/svg/misc/logo.svg index 16227b3..8e8c68a 100644 --- a/src/assets/svg/misc/logo.svg +++ b/src/assets/svg/misc/logo.svg @@ -1,7 +1,22 @@ - - - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/common/tagList.njk b/src/common/tagList.njk index 23b0b1b..aa8d068 100644 --- a/src/common/tagList.njk +++ b/src/common/tagList.njk @@ -7,6 +7,9 @@ pagination: permalink: /tags/{{ tag | slugify }}/ eleventyComputed: title: '{{ meta.blog.tagSingle }}: {{ tag }}' + eleventyNavigation: + key: '{{ tag }}' + parent: Stories --- diff --git a/src/pages/about.md b/src/pages/about.md index 8dd4967..d0b0896 100644 --- a/src/pages/about.md +++ b/src/pages/about.md @@ -1,22 +1,8 @@ --- -title: About -permalink: /about/index.html -description: 'Eleventy Excellent is inspired bythe companion website of Andy Bell’s talk "Be the browser’s mentor, not its micromanager".' +title: Why Create? +permalink: /why/index.html +description: 'Why create?' layout: page --- -This starter uses modern CSS, fluid type & space, flexible Layouts and Progressive Enhancement, wrapped in a basic template. - -It is built around the CSS boilerplate by Andy Bell and inspired by Andy's talk **'Be the browser’s mentor, not its micromanager'**. - -If you want to know exactly how it all works, [read this article on piccalil.li](https://piccalil.li/blog/a-css-project-boilerplate/). - -The aim is to spread the idea and use of this _excellent_ workflow. To work with it efficiently you should be familiar with [cube.fyi](https://cube.fyi/), [utopia.fyi](https://utopia.fyi/) and [every-layout.dev](https://every-layout.dev/). - -- buildexcellentwebsit.es -- Study the [original CSS boilerplate](https://github.com/Set-Creative-Studio/cube-boilerplate/tree/main) - -## Watch the talk - -
- +Hypngaga is a vision quest by forty-something year old captive of a culture seemingly bent upon self-destruction. \ No newline at end of file diff --git a/src/pages/search.njk b/src/pages/search.njk new file mode 100644 index 0000000..630d08f --- /dev/null +++ b/src/pages/search.njk @@ -0,0 +1,44 @@ +--- +title: Search +permalink: /search/index.html +description: 'Sift through this rubble. ' +layout: page +--- + + + + + + +{% css "local" %} + {% include "css/forms.css" %} + {% include "css/search.css" %} + {% include "css/custom-card.css" %} +{% endcss %} +{% js "defer" %} + {% include "scripts/search.js" %} +{% endjs %} diff --git a/src/pages/stories.njk b/src/pages/stories.njk new file mode 100644 index 0000000..afe33bb --- /dev/null +++ b/src/pages/stories.njk @@ -0,0 +1,23 @@ +--- +layout: base +permalink: /stories/ +title: 'Stories' +description: 'asdf' +eleventyNavigation: + key: Stories +--- + +
+
+
+

{{ title }}

+
+ + {% svg "divider/triangle", null, "divider" %} +
+ +
+ +{{ collections.all | eleventyNavigation('Stories') | eleventyNavigationToHtml | safe }} + +
diff --git a/src/pages/thoughts.njk b/src/pages/thoughts.njk new file mode 100644 index 0000000..36f7735 --- /dev/null +++ b/src/pages/thoughts.njk @@ -0,0 +1,42 @@ +--- +layout: base +title: Thoughts +description: 'Sift through the posts.' +pagination: + data: collections.allPosts + size: 8 +permalink: 'thoughts/{% if pagination.pageNumber >=1 %}page-{{ pagination.pageNumber + 1 }}/{% endif %}index.html' +--- + +
+
+
+

{{ title }}

+
+ + {% svg "divider/triangle", null, "divider" %} +
+ +
+

This blog has a pagination of {{ pagination.size }} posts per page.
+ The pagination is only shown if there are more posts ({{ collections.posts.length }}) than items per + page ({{ pagination.size }}). +

+
+ + + {% asyncEach item in pagination.items %} + {% include "partials/card-blog.njk" %} + {% endeach %} + + + + {% set collectionToPaginate = collections.posts %} + + {% set metaKey = "blog" %} + + {% if collectionToPaginate.length > pagination.size %} + + {% include 'partials/pagination.njk' %} + {% endif %} +
diff --git a/src/posts/2025/2025-11-11-gasheyes-creek.md b/src/posts/2025/2025-11-11-gasheyes-creek.md new file mode 100644 index 0000000..79cc619 --- /dev/null +++ b/src/posts/2025/2025-11-11-gasheyes-creek.md @@ -0,0 +1,11 @@ +--- +title: 'Gasheyes Creek' +description: "A story about a creek." +date: 2025-11-11 +tags: ['place'] +eleventyNavigation: + key: Oakington Peninsula + parent: Harford County +--- + +Begin here.