=== Hafen ===
Contributors: hafenstudios
Requires at least: 6.4
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 0.8.1
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: blog, portfolio, one-column, grid-layout, block-styles, wide-blocks, full-site-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, style variations and a self-hosted variable font.

== Description ==

Hafen is a complete block theme (Full Site Editing). Layout, colors, spacing
and typography are defined in theme.json and can be adjusted in the site
editor.

The theme ships a self-hosted variable font, so no font files are requested
from a third-party service. The included style variation "Launch" uses system
fonts instead.

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-900
* Style variation "Launch": system fonts, no font file loaded
* Block styles for TL;DR, definition, FAQ and step content
* Page patterns built from Core blocks (hero, features, product cards, CTA,
  stats band, timeline, FAQ, about, blog grid, comparison table)
* Accessibility features: skip link, focus rings, landmarks, reduced-motion
  support
* Fully translation-ready

== Installation ==

1. Upload and activate the theme under Appearance > Themes > Add New.
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.

= 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.

== 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 ==

= 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 ==

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