fp6+
All checks were successful
Deploy / build-deploy (push) Successful in 3m6s

This commit is contained in:
Jorijn van der Graaf 2026-08-19 17:19:51 +02:00
commit ed61fb5ca5
12 changed files with 254 additions and 38 deletions

View file

@ -676,8 +676,8 @@ export RenderedPage RenderShop(std::span<const Product> products, const Rates& r
RenderedPage page;
page.meta.title = "Shop — Catcrafts";
page.meta.description =
"Fairphone (Gen. 6) handsets reflashed to run postmarketOS, with the "
"IMS/VoLTE stack Catcrafts maintains.";
"Fairphone (Gen. 6) and (Gen. 6+) handsets reflashed to run postmarketOS, "
"with the IMS/VoLTE stack Catcrafts maintains.";
page.meta.canonical = "/shop";
page.meta.geoPriceHint = true;
// The category page as typed data: an ItemList naming each product page.
@ -1325,16 +1325,23 @@ export RenderedPage RenderProduct(const Product& product,
// The spec and warranty sections exist only where the content does: a
// donation has neither a spec sheet nor a warranty, and an empty table
// under a Fairphone-specific lede would be nonsense on its page.
// under a manufacturer-specific lede would be nonsense on its page.
//
// The lede names the BRAND, never a model. It used to say "Fairphone
// (Gen. 6)" in the markup, which read true while the catalogue held one
// phone and went silently false the moment it held two — a spec sheet
// introduced as some other device's sheet is worse than no lede at all.
// A spec sheet with no brand to name is a content bug, asserted against in
// ShouldShipContent rather than papered over with a second sentence here.
const SafeHtml specsSection = product.specs.empty() ? SafeHtml{} : Format(
R"(<section class="section">)"
R"(<h2 class="section__title">Specifications</h2>)"
R"(<p class="section__lede">The hardware is a stock Fairphone )"
R"((Gen. 6), unmodified. Fairphone's spec sheet is this product's spec sheet, )"
R"(<p class="section__lede">The hardware is a stock {}, unmodified. )"
R"({}'s spec sheet is this product's spec sheet, )"
R"(and all of it works under postmarketOS.</p>)"
R"(<table class="spec-table"><tbody>{}</tbody></table>)"
R"(</section>)",
Join(specRows));
Escape(product.brand), Escape(product.brand), Join(specRows));
const SafeHtml warrantySection = product.warranty.empty() ? SafeHtml{} : Format(
R"(<section class="section">)"
R"(<h2 class="section__title">Warranty</h2>)"