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 = ` `;
+ }
+
+// 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}
+
+ ${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.