=== Hafen ===
Contributors: hafenstudios
Requires at least: 6.6
Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.2.2
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: blog, news, portfolio, one-column, grid-layout, block-styles, wide-blocks, full-site-editing, full-width-template, template-editing, custom-colors, custom-logo, custom-menu, editor-style, featured-images, threaded-comments, translation-ready, style-variations, block-patterns

A block theme for content-led websites, with block patterns, a magazine blog layout, 38 style variations and a self-hosted variable font.

== Description ==

Hafen is a complete block theme built for full site editing. Layout, colors,
spacing and typography are defined in theme.json and can be adjusted in the
site editor.

The theme ships 38 style variations. Beyond swapping colors, each variation
can change the typography pairing and scale, the corner radii of cards,
buttons and pills, and the overall density (spacing, line height, content
width). Every variation uses a system font stack and loads no font file;
the default look uses a self-hosted Inter variable font, so no fonts are
requested from a third-party service. Every variation is measured against
WCAG 2.1 AA contrast requirements before release.

Post listings (blog, archive, search) use a two-column magazine layout with
the first post as a full-width lead card. Posts without a featured image
receive a gradient accent strip so grids stay consistent.

Features:
* Full site editing with theme.json as the single source of truth
* Self-hosted Inter as a single variable font file covering weights 100 to 900
* 38 style variations across four design axes: color, typography, shape and density
* Magazine-style post listings with a full-width lead post
* Block styles for TL;DR, definition, FAQ and step content
* Page patterns built from core blocks: hero, features, product cards, call
  to action, stats band, pricing, team, testimonials, logo band, trust band,
  timeline, FAQ, about, contact, blog grid, comparison table and "More on
  this topic" below posts
* Four section styles (dark band, surface, brand tint, night) for Group and
  Columns blocks, following every style variation
* A page template for full-width classic content that eases migrations from
  classic themes
* Accessibility features: skip link, visible focus rings, landmarks,
  reduced-motion support
* Fully translation-ready, with a complete German translation included

== Installation ==

1. Upload and activate the theme under Appearance > Themes > Add Theme.
2. Customize the header/footer, colors, and homepage under Appearance >
   Editor.
3. Assign your menu: the header ships with a starter navigation. Open
   Appearance > Editor > Navigation to pick or build your own menu.

== Frequently Asked Questions ==

= Does the theme output schema markup or llms.txt? =
No. Under the WordPress.org guidelines that functionality belongs in a
plugin. The theme's block styles work with any plugin that emits structured
data.

= Is a Google Fonts connection required? =
No. Inter is self-hosted. There are no external calls.

= Is Hafen available in languages other than English? =
Yes. Hafen is fully translation-ready and ships with a complete German
(de_DE) translation.

= How do I change the width of the reading column? =
Open Appearance > Editor > Styles > Layout and set the content width. The
default is 680px, tuned for comfortable reading (about 68 characters per
line). Recommended steps: 620px (focused reading), 680px (default), 780px
(wide) and 860px (extra wide). Wide and full-width blocks are not affected
by this setting.

= How do I get exactly one H1 on a page built from patterns? =
Hero, Hero with AI Answer Panel and Landing Page (Complete) carry the H1 of
the page. Use them on the "Page without title" template: it adds no title of
its own, and full-width sections span the whole window while plain text
keeps the reading width. About Us and Contact Section start with an H2: place
them below a hero, or change their first heading to H1 when one of them
opens a page on that template.

= Why does the last row of the blog show a single post? =
Post listings show the newest post as a lead card across both columns and
the rest in two columns. WordPress shows 10 posts per page by default, which
leaves one post alone in the last row. Set Settings > Reading > "Number of
recent posts shown on archive pages" ("Blog pages show at most" before
WordPress 7.1) to 9 for an even grid (or 7, 11, 13 and so on).

= Why does the header show a generic menu? =
The navigation block starts without a fixed menu reference so it picks up
your existing menu where possible. Choose or create your menu under
Appearance > Editor > Navigation.

= How do I change the colors of the mobile menu? =
Select the Navigation block in the header (Appearance > Editor), open its
Styles panel and set the overlay background and text colors. Use the block
settings rather than custom CSS: the block colors always win, work in every
style variation and are picked up by the theme's menu styling.

= Why does the header show the menu button on tablets? =
Menus with five or more items overflow between 600 and about 1000px. The
theme switches to the menu button below 782px, the breakpoint WordPress
itself uses for its admin layout. Between 782 and 1023px the menu items
move closer together in 16px text, and up to 999px a separate header button
outside the menu is hidden, so the menu stays on one line; a menu item with
the class hafen-cta stays visible. If a very long menu still wraps, set the
overlay menu of the Navigation block to "Always".

= I moved from a classic theme and some pages look off. What helps? =
Use the page template "Classic content (full width)" for pages with
fixed-width markup, set the logo width in the header part to about 56px,
and pick your menu under Appearance > Editor > Navigation (without one, the
header lists all pages).

= How do I add a contact button to the header? =
Since 1.2.1 the default header has no separate button: it linked to the
contact section of one page and led nowhere on all others. Open the
Navigation block in the Site Editor, select the menu item you want to use as
the call to action (for example your contact page) and enter hafen-cta under
Advanced > Additional CSS class(es). The theme then renders that item as a
pill button in the header and as a centred full-width button at the bottom
of the mobile menu. Headers you customised before 1.2.1 keep their button.

= How do I remove or change the "More on this topic" section below posts? =
Open Site Editor > Templates > Single post: the section is an ordinary
pattern there, so you can delete it, move it, or change the number of posts
in the Query Loop block. Keep the class hafen-mehr-zum-thema on the group and
the post template if you want the theme to keep filtering by the post's
categories and hiding the post being read.

= PageSpeed says my logo has a low resolution. What helps? =
Upload the logo at least twice as wide as it is shown. The header shows it
at 56px by default, so upload 112px or wider; high-density screens then get
a sharp image and the warning "Serves images with low resolution" goes away.

== Copyright ==

Hafen WordPress Theme, (C) 2026 hafenstudios.
Hafen is distributed under the GNU General Public License v2 or later.

== Resources ==

* Inter Font — Copyright (c) Rasmus Andersson, SIL Open Font License 1.1
  https://github.com/rsms/inter — https://scripts.sil.org/OFL
  Bundled as a variable font file (woff2, Latin subset) from the Google
  Fonts distribution (fonts.gstatic.com), self-hosted.
* Icons: original set, inspired by the Feather icon vocabulary (MIT),
  redrawn as inline SVG. Copyright (c) 2026 hafenstudios, GNU General
  Public License v2 or later.
* screenshot.png — original work, (C) 2026 hafenstudios, GNU General
  Public License v2 or later. Shows only the theme itself with placeholder
  copy; no photography, no third-party images, no third-party brands or
  logos.
* The theme does not ship any further images or media files. All patterns
  are built from Core blocks, text, and inline SVG.

== Changelog ==

= 1.2.2 =
Fix release for pattern grids on phones.

* Fixed: the card grids in Landing Page (Complete), Feature Grid and Product
  Cards stayed in three columns on phones, the stat cards in Stats with Pills
  in four. The grids now keep 3 or 4 as the maximum number of columns and
  set a minimum column width (13rem for the cards, 9rem for the stat cards),
  so they wrap to fewer columns on narrow screens. Wrapping needs WordPress
  7.0 or later: before 7.0, WordPress uses the minimum column width only for
  grids without a column count, so WordPress 6.6 to 6.9 keep the fixed
  columns as before. The desktop layout is unchanged on all supported
  versions. Pages already built from these patterns keep their saved grid:
  select the grid group and set a minimum column width in its Layout
  settings.
* Performance: the front end loads style.min.css, a minified copy of
  style.css built when the package is made (about 40 percent smaller, and
  PageSpeed no longer reports the theme stylesheet as unminified). style.css
  stays in the package as the readable source and for the editor.
* Docs: FAQ on logo sharpness (upload at least twice the display width).
* Docs: the FAQ names the Reading setting by its WordPress 7.1 label,
  "Number of recent posts shown on archive pages" (before 7.1: "Blog pages
  show at most").
* Tooling: tools/bloecke-pruefen.php also reports grids with a fixed number
  of columns and no minimum column width, and minimum column widths outside
  6rem to 30rem.

= 1.2.1 =
Fix release for findings from tutorial recordings in WordPress 7.1.2.

* Fixed: choosing a style variation in the Site Editor still preloaded the
  Inter font file (48 KB), although no text used it. The preload check now
  reads the font presets of all origins (default, theme, custom), not only
  custom, and preloads only when the active Inter preset has a font face.
* Fixed: six patterns showed "Block contains unexpected or invalid content"
  in the editor: CTA Band, Footer with Columns, Landing Page (Complete),
  Logo/Partner Bar, Trust Bar and the post navigation below posts. Colors
  and borders in their saved HTML now match the block settings exactly.
* Fixed: the "Page without title" template kept its content in the reading
  column, so full-width patterns such as the hero showed as a box. Full-width
  sections now span the window, plain text keeps the reading width, and a
  page that starts with plain text keeps its space below the header.
* Changed: the default header no longer has the "Get in touch" button. It
  linked to #kontakt, which exists only on a page with the Contact Section
  pattern. Use the menu class hafen-cta for a header button (see FAQ).
  Headers customised in the Site Editor are not affected.
* Fixed: between 782 and about 1000px the header menu wrapped into two
  lines with five items and a header button. From 782 to 1023px the menu
  items now sit closer together in 16px text, and up to 999px a separate
  header button is hidden. Tested from 782 to 1280px with and without a
  logo, with a hafen-cta menu item and with a customised header button.
* Fixed: the Contact Section pattern mentioned a contact form the theme does
  not have; its button now opens an email (mailto) like the email line.
* New: single posts show their tags below the content, styled like the
  category line; posts without tags show nothing. Category and tag lines
  wrap between terms and keep the comma with the term before it.
* Changed: post card excerpts are 32 words long instead of 22.
* Docs: the readme says "Add Theme" (the button label in WordPress 7.1)
  and has new FAQ entries on one H1 per page and on 9 posts per page for
  an even blog grid. The About Us and Contact Section descriptions explain
  how to keep one H1.
* Tooling: static block check for all patterns, parts and templates
  (tools/bloecke-pruefen.php) and a self-check for the font preload
  (tools/preload-pruefen.php).

= 1.2.0 =
Content release on top of the 1.1.0 menu system.

* New: pattern "More on this topic" below single posts: four more posts in
  the magazine grid, from the same categories when the post has any, the
  post being read excluded, and the whole section hidden when nothing else
  exists. It restores the internal links a sidebar used to provide. Remove
  or change it under Site Editor > Templates > Single post.
* New: menu items with the CSS class hafen-cta render as a call-to-action
  pill in the header and as a full-width button at the end of the open
  mobile menu.
* New: four section styles for Group and Columns blocks (Hafen: Dark band,
  Surface, Brand tint, Night), built from palette tokens so they follow all
  38 style variations and pass the contrast check.
* Changed: the three-column footer (brand, navigation, contact) is the
  default footer part; copyright and credit lines are shared patterns.
  Sites that customised their footer in the Site Editor keep it.
* Changed: post cards in listings use an h2 title and no longer add a
  separate "Read more" link, so each card has one clear link; the comment
  form title is an h2. Both close the last gaps in the accessibility-ready
  self-audit (see accessibility.txt).
* Changed: H1 letter-spacing is -0.035em (was inherited -0.025em).
* New: accessibility.txt with audit status, testing method and known
  limitations.
* Tooling: the contrast check covers the section styles and the CTA pill;
  the POT generator collects the section style titles.

= 1.1.0 =
The menu release. Every known live installation had rebuilt the mobile menu
with its own CSS; this version makes that the theme standard.

* New: the header collapses into the menu button below 782px instead of
  core's 600px, so menus with five or more items no longer wrap on tablets.
  Pure CSS, no !important, no extra JavaScript.
* New: the open menu is a structured list: full-width rows with hairline
  dividers, large labels, child items indented along a line, parents
  without a link set as spaced uppercase headings, a 44px round close
  button and the current page underlined in the dark brand color. Colors come from the
  block's overlay colors (base and contrast by default) or currentColor, so
  it works on all 38 style variations and with custom overlay colors. Site
  CSS with one extra class still wins over the theme rules.
* New: the menu button pill also applies to the "always" overlay mode and
  has a subtle hover state.
* New: desktop dropdowns follow the theme (base, contrast, border token,
  corner radius, lift shadow) instead of core's fixed white and black.
* New: the sticky header sits below the admin bar for logged-in users.
* New: block style "Hafen: Passepartout" for images (thin frame in the
  brand color, spaced uppercase caption).
* New: tables get borders, a header row and cell padding from the theme;
  the cite line in quotes is set in small muted type.
* Fixed: the sticky header never stuck. Core wraps the header part in a
  <header> of exactly the same height, and position: sticky cannot move an
  element out of its container. The wrapper is now sticky whenever it
  contains nothing but the theme header; sites with their own header
  markup keep their behavior.
* Fixed: anchor jumps use one mechanism now: scroll-padding on the page
  with the measured header height (0 when the header does not stick) plus
  the admin bar when logged in. --hafen-scroll-offset (set on :root) still
  overrides it, and it now also covers anchors outside the post content,
  including the skip link target. The 0.9.1 scroll-margin rule is gone.
* Fixed: the skip link was output twice (theme and core) and announced
  twice by screen readers; core's copy is removed while the theme's own
  link is present.
* Fixed: the footer copyright line measured 3.9:1 on a custom dark footer
  color; it is slightly lighter now (5.1:1 on the reported color, 7.2:1 on
  the default).
* Fixed: duplicate id="kontakt" when the Contact and Call to Action
  patterns shared a page; the call to action no longer carries the id.
* Fixed: the second header template part was identical to the first; it is
  now "Header (logo only)" for sites whose logo carries the wordmark (the
  site title still shows until a logo is uploaded).
* Fixed: custom-logo theme support is registered (the tag was declared
  without it).
* Fixed: child themes no longer lose the parent stylesheet.
* Changed: the header and footer groups render as div inside core's own
  <header> and <footer> wrappers, so the banner and contentinfo landmarks
  are announced once instead of twice.
* Changed: the focus ring no longer forces a 4px radius, so pills and round
  buttons keep their shape when focused.
* Changed: pattern descriptions for hero, AI hero and landing page point to
  the "Page without title" template; the AI panel texts read as an example
  rather than a live answer.
* Tooling: the contrast check covers the menu pairs (overlay text, menu
  button, current page) and the corrected footer color.

= 1.0.0 =
The looks release: 33 new style variations, 38 in total. Hafen leaves the 0.x range: the theme has been in production on multiple sites since 0.4, and with the look system, the migration hardening and the contrast gate it is feature-complete for its first stable line.

* New: 33 style variations under Appearance > Editor > Styles. Unlike the
  earlier ones they change all four design axes: color, typography (pairing
  and scale), shape (corner radii) and density (spacing, line height,
  content width). Eight characters with four looks each: functional, warm,
  bold, formal, accessible, technical, playful, editorial, plus one extra seaside look.
* New: every style variation now uses a system font stack, so no variation loads a font file
  at all. The bundled Inter variable font stays in place for the default
  look and is skipped automatically when a system-font look is active.
* New: the corner radius of cards, pills and small boxes is now driven by
  theme.json tokens (settings.custom.radius.card / .pill / .small; the
  default look sets card and pill, every variation may set all three), so a
  variation can go from square to pill shaped.
* New: contrast check for every style variation (tools/kontrast-pruefen.mjs).
  It merges each variation over theme.json, measures the foreground and
  background pairs that actually occur in the theme and fails on anything
  below WCAG 2.1 AA. It replaces the earlier kontrast-check.php.
* Fixed: the year in the timeline pattern used the brand color as text at
  22px, which was below AA on a light ground; it now uses brand dark.
* Fixed: the skip link took the page base color for its label instead of a
  fixed white, which was unreadable on light accent colors.
* Fixed: muted text on a tinted surface measured 4.45:1 to 4.50:1 in the
  default palette and in "North Sea" and "Ink"; the muted grey is slightly
  darker now. "Sandbar" and "Night Passage" got the same treatment for their
  accent pill and their AI accent.
* Changed: gradients now follow the palette of the active variation instead
  of carrying their own fixed hex values, and the "Deep" gradient stays dark
  in every look so white text on the CTA band keeps its contrast.
* Changed: the mobile menu button label is now translatable (it was a
  hardcoded German fallback in CSS); it follows the site language via the
  --hafen-menu-label custom property.
* Changed: "Requires at least" raised from 6.4 to 6.6 to match the
  theme.json version 3 semantics the theme is built and tested against.
* New: the reading column defaults to 680px with an 18px base size (about
  68 characters per line); post listings and wide blocks stay at 1180px.
  The width remains freely adjustable under Styles > Layout.
* New: headings in post content bind to the paragraph that follows them
  (2.75rem above, 0.75rem below) instead of floating in uniform block gaps,
  and h1 to h3 use balanced line wrapping.
* New: outline button style defined in theme.json, pixel-aligned with the
  primary button; comment form and search inputs are now styled, with the
  brand color as the native accent color.
* New: card and lift shadows are theme.json presets, the small corner
  radius is a token (settings.custom.radius.small), and featured images,
  hero gradients and decorative accents all follow the tokens, so every
  style variation carries the shapes and colors through consistently.
* New: dark style variations declare color-scheme dark, so native controls
  (scrollbars, select arrows, form autofill) match the look.
* New: the default header includes the call-to-action button (delete it in
  the site editor if unwanted), and post cards in listings show the
  category above a quieter date.
* Changed: h5 and h6 have defined sizes (h6 renders as an overline),
  quotes carry a brand-colored left border, captions use the muted color.
* Changed: refreshed screenshot, description and theme tags (news,
  full-width-template, template-editing added).

= 0.9.1 =
Hardening round from a real classic-theme migration (flirtuniversity.de).

* New page template "Classic content (full width)": renders the page content
  without the theme's content-width constraints, so fixed-width markup from a
  classic-theme era displays uncut after a migration.
* Embeds (iframe, embed, object, video) are now capped at 100% width inside
  the post content. Fixed-width video embeds no longer break mobile layouts.
* Anchor targets inside the post content get a scroll offset so jump links no
  longer land underneath the sticky header. Adjustable via the
  --hafen-scroll-offset custom property.
* The mobile menu overlay now follows the theme's base and contrast colors
  instead of core's fixed white-on-black default when the navigation block
  carries no colors of its own. Dark style variations no longer flash a
  white menu.
* The 404 page headline now uses the brand gradient instead of a fixed violet,
  so it follows custom brand colors.

= 0.9.0 =
Magazine layout for post listings (blog, archive, search).

* Two-column magazine grid with the first post as a full-width featured card
  instead of the previous three-column grid.
* Posts without a featured image get a designed brand-gradient fallback strip,
  so grids no longer look patchy.
* Pagination controls enlarged to comfortable touch targets, current page
  clearly marked.
* New blog header pattern that uses the posts page title with a fallback.

= 0.8.1 =
Review-Runde 1 auf WordPress.org (Ticket #284532).

* Theme URI entfernt (optionales Feld, verwies auf die Produktseite).
* Beschreibung in style.css und readme.txt ohne Leistungsangaben und
  Marketing-Sprache neu gefasst.
* Screenshot ohne Werbetext, nur noch Platzhalterinhalte.
* Alle sichtbaren Zeichenketten in den Mustern timeline, stats und
  performance sind jetzt uebersetzbar.

= 0.8.0 =
The WordPress.org submission release.

* Footer credit reduced to a single outgoing link (theme page).
* Removed the admin notice recommending the companion plugin.
* Links inside content are now underlined by default (WCAG 1.4.1);
  navigation, site title, and post titles stay clean.
* Version aligned across style.css, functions.php, and language files.

= 0.7.1 =
* Footer credit now links the hafenstudios name to the homepage as well
  (two link targets: theme page + homepage, matching the reference sites).

= 0.7.0 =
The internationalization release: English is now the source language.

* All source strings — patterns, functions.php, theme.json display names,
  style variation titles — are English now; a complete German translation
  (de_DE.po/.mo) ships with the theme. German sites keep the exact same
  wording as before; it now comes from the language file instead of the
  source code.
* Style variations carry English titles: Night Passage (Nachtfahrt),
  North Sea (Nordsee), Sandbar (Sandbank), Launch (Stapellauf), Ink
  (Tinte). German users keep seeing the German names via translation.
* The last untranslatable strings in plain-HTML templates moved into
  hidden PHP patterns: the "no results" texts, the post navigation
  labels, the navigation aria labels, and the footer credit line. Note:
  empty archive and author pages now share one generic "No posts found
  yet." text instead of two specific ones.
* The footer credit line and the theme description drop the "AI-native"
  claim in favor of what can be verified: fast, accessible, answer-ready —
  consistent with the repositioned readme.
* New screenshot: the current neutral hero with the header contact
  button and English placeholder copy, rendered from the theme's real
  design tokens.

= 0.6.0 =
Cleanup and expansion release following the 0.5.0 launch on boeasy.de:
worked through the open items from the independent theme report, made
templates translatable, new building blocks.

* Palette cleaned up: the internal color slugs memberjet/adjet were named
  after company products and ended up as has-memberjet-color in the HTML
  of every client site. They are now called accent-2/accent-3; a
  compatibility block in style.css keeps existing content working until
  it is migrated.
* theme.json and all five style variations updated to schema version 3
  (the default since WordPress 6.6). Custom font sizes and spacing stay
  exclusive (defaultFontSizes/defaultSpacingSizes: false) so no Core
  duplicates show up in the editor pickers.
* Templates now translatable: "Read more", the search field text, the
  entire 404 page, and the copyright line now run through hidden PHP
  patterns via the text domain — the same mechanism Twenty Twenty-Five
  uses. The copyright line now writes the year dynamically instead of a
  hardcoded "© 2026".
* Fixed: the 404 page's "Back to homepage" button pointed hard at "/" and
  led nowhere on subdirectory installs; now uses home_url().
* New template part "Header with contact button" — the screenshot
  previously showed a header button the theme did not actually provide.
* More honest product copy: the default hero no longer includes the
  illustrative AI-answer panel (still available as its own "Hero with
  AI-answer panel" pattern); the Machine-readable pattern no longer
  promises AI visibility, but describes the benefit that can actually be
  backed up.
* New building blocks: FAQ section (collapsible without JavaScript),
  About, Blog grid, and Comparison table patterns, plus the author
  archive template author.html. The landing page template is now a
  generic client page instead of our own product-page skeleton.
* Display names for colors, font sizes, and spacing are now consistently
  German throughout (slugs unchanged, existing content unaffected).

= 0.5.0 =
WordPress.org submission preparation plus fixes from two client
deployments (frauenverbaende-dortmund.de, boeasy.de).

Broken things first:
* CRITICAL fix: the mobile menu got stuck inside the header. The sticky
  header's backdrop-filter turned it into the containing block for the
  navigation's position:fixed overlay; the opened menu stayed trapped at
  header height (measured: 83px instead of the full viewport height) and
  was unusable. The blur is now dropped while the menu is open, and only
  applied where the browser supports the required :has() query. Affected
  every installation using the default header.
* CRITICAL fix: the opened mobile menu had no background color. The
  Navigation block set neither overlayBackgroundColor nor
  overlayTextColor, Core defaulted to "transparent", and the menu items
  sat raw on top of the page content.
* Fixed: images hung outside the cards. The card is a flex container with
  align-items:flex-start; as a result a featured image was not stretched
  to card width but kept its intrinsic width (1500px in practice), and
  visibly overran the card's edge and corner radius. Cards now clip
  (overflow) and stretch media correctly.
* Fixed: the dark style variation "Nachtfahrt" was unreadable in places.
  style.css hardcoded #fff for cards, answer blocks, chips, the sticky
  header, and the menu button; in Nachtfahrt that meant near-white text
  on a white surface (measured 1.12:1). All surfaces now run through the
  base/surface presets, measured at 16.07:1.
* Fixed: fixed widths in legacy content (typical after migrating from a
  classic theme) caused horizontal overflow that broke the header layout,
  hamburger included. The theme now guards against this defensively.

Accessibility — the readme has been promoting this, now the theme
actually delivers on it:
* Visible keyboard focus on all interactive elements (a brand-dark ring
  plus a light offset, works on both light and dark surfaces).
  Previously there was not a single outline rule anywhere in the theme
  CSS.
* The default button used white on brand (#14a08c), measuring 3.26:1 —
  below WCAG AA (4.5:1). The base tone is now brand-dark: 5.03:1. All
  five style variations were re-measured; body text, buttons, links, and
  muted text all pass AA consistently (check script kontrast-check.php).
* Links underline on hover and are no longer distinguishable by color
  alone (WCAG 1.4.1).
* The mobile menu button's border now uses brand-dark instead of border:
  as a UI control, the outline needs 3:1 (WCAG 1.4.11); it was 1.23:1
  before.
* The main navigation now carries an ariaLabel so the two nav landmarks
  on a page can be told apart.

Field feedback from client deployments:
* Blog, archive, and search cards now show the featured image (16:9,
  size "large" instead of the 2560px originals). Archives previously
  looked like plain text lists.
* The footer credit is now visible instead of shipping with
  display:none. Anyone who doesn't want it can delete the paragraph in
  the editor. Its colors are inherited so it stays readable in a light
  footer too.
* Less white space above the content on small screens: spacing steps
  5 · XL and 6 · 2XL now scale with viewport width instead of being fixed
  at 3rem and 4.5rem, respectively.
* Logo defaults raised from 40/34px to 56/44px; at 40px the logo looked
  like a favicon on Retina and 125% displays.
* The site title next to the logo is now hidden below 640px when a logo
  is set — long titles used to wrap awkwardly there.
* The "Landing page (full width)" template no longer constrains content
  down to 780px.
* The hardcoded "Blog" eyebrow has been removed from the index template;
  it wasn't translatable and rarely fit association or company sites.

Submission preparation:
* New: LICENSE file (GNU General Public License v2 or later) in the
  theme root.
* Fix: the skip link ("Skip to content") is now output via PHP
  (wp_body_open) instead of as static text in the header template part,
  making it translatable via the text domain for the first time. Block
  templates/parts are plain HTML with no PHP interpreter; their text
  content fundamentally cannot be translated via Gettext. That remains a
  known, unresolved limitation of block themes (it affects the official
  WordPress default themes too) for the few remaining text strings in
  templates/ and parts/.
* languages/hafen.pot regenerated: for the first time including all
  theme.json and style-variation strings (color, gradient, font-family,
  font-size, and spacing names, template and footer titles, style-
  variation names and descriptions) with the matching msgctxt contexts,
  as intended by the WordPress core tooling. Previously, these roughly
  47 strings were never translatable.
* Confirmed: style.css header, tags, and text domain are complete; no
  functionality in the theme that belongs in the plugin per the
  guidelines (no custom post types, shortcodes, or tracking); no
  external font/script calls; consistent hafen_ prefixing; php -l and
  JSON validation clean across the entire theme.

= 0.4.0 =
The theme finally mentions that a companion plugin exists.
* New: a one-time notice about the free "Hafen Core" plugin after theme
  activation. Until now the theme never mentioned it anywhere — anyone
  who wanted the setup wizard, the schema output, or llms.txt simply had
  no way of knowing they existed. The notice appears only on the
  dashboard and under Appearance > Themes, only for users with
  plugin-install capability, and disappears on its own once Hafen Core
  is active. Clicking "No thanks" dismisses it permanently (stored per
  user). No redirect, no popup, no notice on other screens. When
  switching to a different theme, Hafen cleans up its own options.
* Correction: the installation section used to promise an "onboarding
  prompt" that didn't exist in the code. It now describes what actually
  happens.
* languages/hafen.pot regenerated. The file had been stale since 0.2.2:
  the six patterns added in 0.3.0 (Contact, Testimonials, Team, Pricing,
  Logo band, Footer) were never extracted and therefore not translatable.

= 0.3.1 =
Performance package: speed is a core promise, here's the proof.
* New: Inter as a single variable font file (inter-variable.woff2, Latin
  subset, weights 100-900, ~47 KB) instead of six static files (~142 KB).
  Umlauts ä/ö/ü/ß are included. Every weight used so far (400-900) stays
  available pixel-for-pixel; no content needs to be touched.
* New: style variation "Stapellauf (system fonts, 0 KB fonts)": identical
  color palette, but a pure system-font stack with not a single font
  file. The fastest possible start; typography follows the operating
  system.
* Improvement: font preload now points to the single variable file and
  is automatically skipped when a system-font variation is active. The
  documented off switch (filter hafen_preload_font_weights) still
  applies; the file list is now filterable via hafen_preload_font_files.
* Honest numbers instead of Lighthouse promises in the description and
  readme: about 5 KB of CSS+JS (gzip) in 2 requests, entirely under
  55 KB including the font, zero external requests.

= 0.3.0 =
Release preparation: style variations, bread-and-butter patterns, new
template.
* New: 4 style variations (Appearance > Editor > Styles): Nachtfahrt
  (dark), Nordsee (blue + serif headings), Sandbank (warm/earthy), Tinte
  (indigo). One click recolors the whole site; content stays untouched.
* New: 6 patterns for real client sites: contact section,
  testimonials, team introduction, pricing table, logo/partner band,
  footer with columns.
* New: "Page without title" template for pages whose heading comes from
  a hero pattern.
* Fix: global box-sizing: border-box (columns with padding overran the
  viewport on mobile devices).

= 0.2.2 =
Pattern copy neutralized, no product advertising in the theme.
* All patterns now contain exclusively neutral placeholder copy as a
  starting point for your own content. Visible self-references to the
  theme and its maker have been removed ("Why Hafen" -> "Why us", "Set
  sail with Hafen" -> "Ready to get started?", product descriptions ->
  generic benefit cards).
* Pattern "Performance" (hafen/performance) is now called "Stats with
  pills": the numbers are clearly labeled as example values for a demo
  section, and the Lighthouse and Core Web Vitals claims are gone.
* Pattern "Trust band" now shows neutral partner placeholders instead of
  third-party brand names.
* Sections that explain the underlying concepts (llms.txt, answer
  blocks, structured data) are kept, but without product names and
  without unsubstantiated promises.
* languages/hafen.pot regenerated (changed strings).
* Unchanged: the single footer credit link to the author URI (permitted
  under the theme review guidelines).

= 0.2.1 =
WordPress.org preparation.
* i18n: all visible text in the patterns is now translatable
  (esc_html__() or wp_kses_post( __() ) for inline markup). New
  languages/ folder with hafen.pot.
* Pattern "Jet family" replaced by the neutral pattern "Product cards"
  (hafen/product-cards): three generic cards with placeholder copy, no
  more product names. The landing pattern now references the new slug.
* Theme description (style.css, readme.txt) without third-party product
  names; the color presets are now named neutrally ("Accent blue",
  "Accent orange").
* llms.txt example in the "Machine-readable" pattern now uses neutral
  placeholders.
* Footer credit is now opt-in: hidden via CSS by default, visible only
  after explicit consent in the Hafen Core assistant.
* New: screenshot.png (1200x900).

= 0.2.0 =
Source: field feedback from vielfalt-begleiten.nrw.
* Fix: the "Landing page (full width)" template no longer
  double-constrains content down to 780px. The main group now uses
  layout "default", and the page content has its own constrained layout
  (contentSize 780px, wideSize 1180px). Body text stays narrow and
  readable, alignwide becomes 1180px, alignfull the full viewport width.
* Fix: heading typography is now defined only via styles.elements.heading.
  The duplication under styles.blocks.core/heading (selector
  .wp-block-heading) has been removed, so custom font settings made
  through the site editor (styles.elements) take effect again. No visual
  change.
* Fix: the block style "Hafen: Checklist" now works directly from the
  inserter. The CSS now serves .is-style-hafen-checklist in addition to
  the previous .hafen-checklist selector; existing content with the
  class set directly remains unaffected.
* Fix: pattern copy cleaned up. Wording about features that don't exist
  ("read-only endpoint" in the Machine-readable pattern, "Product" schema
  in the feature grid) replaced with honest descriptions.
* Improvement: hero pattern now uses neutral placeholder copy ("Your
  compelling headline") instead of self-promotion for Hafen. Fresh sites
  no longer look like advertising for the theme.
* New: font preset "Serif" (Georgia, Iowan Old Style, Times New Roman) in
  theme.json, with no additional font files. Handy for large stats and
  quotes.
* New: pattern "Stats band" (hafen/stats). Four cards with a large serif
  number in the brand color and a label, as an alignfull section with a
  1180px content width.
* New: pattern "Timeline" (hafen/timeline). Five milestones with year,
  title, and text along a vertical line with dots, one highlight marker
  in the AI color. Built from Core blocks plus a small amount of scoped
  CSS (classes hafen-timeline*, colors via theme presets).

= 0.1.5 =
* Correction: consistent use of real umlauts (ä/ö/ü/ß) instead of ASCII
  substitutes (ae/oe/ue/ss) throughout all visible text, pattern content,
  and theme.json labels.

= 0.1.4 =
* Subtle footer credit "Built with Hafen" (a single attribution link,
  compliant with the WordPress.org theme guidelines). Removable with one
  click: delete the paragraph in the editor under Appearance > Editor >
  Footer.

= 0.1.3 =
* Mobile menu: the default WordPress hamburger (a bare 24px icon)
  becomes a clearly visible, tappable "Menu" button with a 44px touch
  target; the overlay links are larger. The menu already worked, but was
  too easy to miss. Label customizable via the CSS variable
  --hafen-menu-label.

= 0.1.2 =
* Fix: header and footer are now neutral (your logo/title + your menu).
  The Hafen demo branding ("AI-native" label, "Get Hafen" button,
  hafenstudios copy) is gone; styling now runs through CSS classes.
* Fix: block validation. Cleaned up inconsistent inline styles (shorthand
  padding, preset backgrounds, named HTML entities) so the editor no
  longer shows an "invalid content" warning. Spacing now runs through
  blockGap instead of inline styles.

= 0.1.1 =
* Fix: front-page.html removed. The theme no longer overrides the
  homepage; that's controlled again via Settings > Reading. The complete
  landing page is now available as an optional page pattern "Hafen
  Landing (complete)".

= 0.1.0 =
* Initial version: theme.json tokens, FSE templates and parts, answer
  block styles, eight landing patterns, self-hosted Inter font.

== Upgrade Notice ==

= 1.2.2 =
Card grids in four patterns now wrap on phones with WordPress 7.0 or later;
WordPress 6.6 to 6.9 keep the fixed columns. Pages built from these patterns
before 1.2.2 keep their saved grid until you set a minimum column width on it.

= 1.2.1 =
Fixes invalid-block warnings in six patterns, the font preload with style
variations and full-width patterns on "Page without title". The default
header drops its "Get in touch" button (dead link on most pages); headers
customised in the Site Editor keep theirs.

= 1.2.0 =
Adds "More on this topic" below posts, four section styles and the hafen-cta
menu class; the three-column footer becomes the default for fresh installs.
No breaking changes.

= 1.1.0 =
Mobile menu rebuilt as the theme standard (782px breakpoint, structured
overlay, styled dropdowns), anchor offsets merged, skip link announced
once. No breaking changes; sites with their own menu CSS keep it.

= 1.0.0 =
Adds 33 style variations, reading-column typography, styled forms and
token-driven shapes. No breaking changes; update safely.

= 0.8.0 =
Submission-ready release: single-link footer credit, no plugin notice,
underlined content links. No breaking changes; update safely.
