diff --git a/CHANGELOG.md b/CHANGELOG.md index 764ea23..b6e7eb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,14 @@ Recipe imports are logged both here (summary) and in ### Added +- **Static site: full-text search (ADR 0003, PR 2 of the site phase).** Added a + `/search/` page powered by [Pagefind](https://pagefind.app/), a static search index + built from the site output (`npm run build` now runs `eleventy && pagefind`). Only + recipe pages are indexed (`data-pagefind-body`), with a Category filter, clean result + titles and thumbnails, and highlighted matches. Search assets are self-hosted in the + generated bundle (no external requests). Verified locally: 487 recipes indexed, and a + query returns matching recipes with photos. + - **Static site: scaffold, data layer, and first theme (ADR 0003, PR 1 of the site phase).** An [Eleventy](https://www.11ty.dev/) site under `site/` that generates a recipe-blog website from the existing Markdown: a landing page led by the biscotti diff --git a/package-lock.json b/package-lock.json index 3c6450b..2f2148f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,8 @@ "devDependencies": { "@11ty/eleventy": "^3.0.0", "gray-matter": "^4.0.3", - "markdown-it": "^14.1.0" + "markdown-it": "^14.1.0", + "pagefind": "^1.5.2" } }, "node_modules/@11ty/dependency-tree": { @@ -198,6 +199,104 @@ "node": ">=18" } }, + "node_modules/@pagefind/darwin-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.5.2.tgz", + "integrity": "sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/darwin-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.5.2.tgz", + "integrity": "sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/freebsd-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.5.2.tgz", + "integrity": "sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@pagefind/linux-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.5.2.tgz", + "integrity": "sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/linux-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.5.2.tgz", + "integrity": "sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/windows-arm64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/windows-arm64/-/windows-arm64-1.5.2.tgz", + "integrity": "sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@pagefind/windows-x64": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.5.2.tgz", + "integrity": "sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@sindresorhus/slugify": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz", @@ -1320,6 +1419,25 @@ "node": ">= 0.8" } }, + "node_modules/pagefind": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.5.2.tgz", + "integrity": "sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q==", + "dev": true, + "license": "MIT", + "bin": { + "pagefind": "lib/runner/bin.cjs" + }, + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.5.2", + "@pagefind/darwin-x64": "1.5.2", + "@pagefind/freebsd-x64": "1.5.2", + "@pagefind/linux-arm64": "1.5.2", + "@pagefind/linux-x64": "1.5.2", + "@pagefind/windows-arm64": "1.5.2", + "@pagefind/windows-x64": "1.5.2" + } + }, "node_modules/parse-srcset": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", diff --git a/package.json b/package.json index 65b51c6..fc4c48e 100644 --- a/package.json +++ b/package.json @@ -5,12 +5,14 @@ "type": "module", "description": "Static site for the Blima Cake recipe archive (Eleventy).", "scripts": { - "build": "eleventy", + "build": "eleventy && pagefind --site _site", + "eleventy": "eleventy", "serve": "eleventy --serve" }, "devDependencies": { "@11ty/eleventy": "^3.0.0", "gray-matter": "^4.0.3", - "markdown-it": "^14.1.0" + "markdown-it": "^14.1.0", + "pagefind": "^1.5.2" } } diff --git a/site/_includes/base.njk b/site/_includes/base.njk index 0a5e263..02d6c62 100644 --- a/site/_includes/base.njk +++ b/site/_includes/base.njk @@ -15,6 +15,7 @@ Home Recipes Tags + Search Cookbook diff --git a/site/assets/style.css b/site/assets/style.css index ce0d747..86f5ad0 100644 --- a/site/assets/style.css +++ b/site/assets/style.css @@ -181,6 +181,19 @@ h1, h2, h3, h4 { font-family: var(--serif); line-height: 1.2; font-weight: 700; .tag-list { list-style: none; padding: 0; margin: 0; columns: 2; } .tag-list li { margin: 4px 0; break-inside: avoid; } +/* Search (Pagefind UI theming) */ +.pagefind { + --pagefind-ui-primary: var(--accent); + --pagefind-ui-text: var(--ink); + --pagefind-ui-background: var(--surface); + --pagefind-ui-border: var(--line); + --pagefind-ui-tag: #f1e7d8; + --pagefind-ui-border-width: 1px; + --pagefind-ui-border-radius: var(--radius); + --pagefind-ui-font: var(--sans); + max-width: 640px; +} + /* Footer */ .site-footer { background: var(--surface); diff --git a/site/recipe.njk b/site/recipe.njk index 9c8beee..c955f58 100644 --- a/site/recipe.njk +++ b/site/recipe.njk @@ -8,19 +8,23 @@ permalink: "{{ recipe.url }}" eleventyComputed: pageTitle: "{{ recipe.title }}" --- -
-