- types.ts re-exported the interface srcset.ts declares, so every build of
an app with the layer warned Duplicated imports "JournalImageVariant"
- a test checks that every name of app/utils and app/composables has one
home
- JournalFeaturedImage renders <picture> from featured_images[].variants:
a WebP source and the original format as srcset fallback, the
original's width and height, alt; lazy in cards, eager with
fetchpriority high on the post page; unchanged without variants
- app/utils/srcset.ts (imageSrcsets) with node tests
- acme fixtures and SSR expectations for both cases
The post page links previous_in_category and next_in_category (the
Journal's opt-in scored related mode) as server-rendered links with the
title in the anchor text when the Journal answers one, else the
site-wide previous_post and next_post (postNeighbours). Types, a fixture
post and expectation lines for both cases.
- post, index, category, tag and author pages render <SeoBreadcrumbs>
at the top of their content while journal.breadcrumbs is on (default);
false leaves the trail to the site's layout, the BreadcrumbList data
is unchanged
- JournalPagination renders <SeoPagination class-prefix="journal-pagination">
with the journal's labels: the same class names, plus page 1, the last
page, gap items, aria labels and head rel prev/next, with links in the
CMS's pagination form
- with vue-seo-layer's seo.pagination.form 'path' the module registers
<listing>/<segment>/:page routes (journalPagedRoutes), and the listing
pages read the page from the :page param or ?page (pageFromRoute)
- the category pillar text renders on page 1 only, the description on
every page; an h1 in it becomes h2 while the category row's
content_h1_to_h2 is on (absent counts as on)
- extend vue-seo-layer (link dependency during development) and drop
@nuxtjs/seo: the page head, canonical and the one JSON-LD graph come
from the CMS resolve answer; the post's own title, excerpt and image
apply only while there is no CMS answer
- remove the journal sitemap source and the copied shared purge route,
library and plugin (the SEO layer serves POST /api/__site__/cache/purge);
the deprecated POST /api/__journal__/cache/purge keeps working
- post title is h1 while the Journal API reports content_h1_to_h2 on
(or absent) and p.journal-post__title while off; journal.postTitleTag
('auto' | 'h1' | 'p') overrides it; body h1 headings are demoted to h2
while the setting is on (gateJournalHtml/sanitizeJournalHtml demoteH1)
- journal.breadcrumbs option and post-title CSS tokens
- smoke harness: count=, header=, noheader= and resolves lines; the
fixture API also answers the SEO resolve and site endpoints
BREAKING CHANGE: the layer no longer installs @nuxtjs/seo (no
nuxt-site-config, nuxt-schema-org, robots or sitemap module, no
/api/__sitemap__/journal source, no useSiteConfig()); apps take their
head, sitemaps and robots from the SEO plugin through vue-seo-layer.
- journal.routes.search (off by default) registers journal-search, the
results page for ?q= in the API's relevance order (no sort is sent),
server-rendered with a Polish-aware result count.
- JournalSearchBox: an icon button and a WAI-ARIA combobox with debounced
?fields=suggest suggestions, stale answers dropped, query words marked
ignoring diacritics; a plain GET form without JS.
- The module keeps the search path out of the route cache and the sitemap
and marks it noindex, follow.
- Client: suggestPosts and the fields option; useJournalLinks.searchLink.
- journal module registers the Journal pages at journal.routes paths
- typed anonymous-GET client, html gate, SSR x-forwarded-for forwarding
- fixture API, built-server SSR smoke and git-tag install check