{b.title}
{b.desc}
diff --git a/app/newsletter/components/WeeklyImpulsesHero.tsx b/app/newsletter/components/WeeklyImpulsesHero.tsx
index b741b03..637a0c8 100644
--- a/app/newsletter/components/WeeklyImpulsesHero.tsx
+++ b/app/newsletter/components/WeeklyImpulsesHero.tsx
@@ -16,6 +16,17 @@ function LockIcon() {
);
}
+// Inline, brand-orange stroke — icon-check.svg's fill lives in an internal
+// CSS var that can't be recolored from outside the SVG when loaded via
+//
/next/image, same fix/reasoning as todo-cards's own IconCheck.
+function IconCheck() {
+ return (
+
+
+
+ );
+}
+
const checklist = [
"Jeden Mittwoch neue Impulse & Tipps",
"Kurz & knackig – in 5 Minuten gelesen",
@@ -89,8 +100,8 @@ export function WeeklyImpulsesHero() {
{checklist.map((item) => (
-
-
+
+
{item}
))}
diff --git a/app/todo-cards/components/Pricing.tsx b/app/todo-cards/components/Pricing.tsx
index b2d8c4b..3761f6d 100644
--- a/app/todo-cards/components/Pricing.tsx
+++ b/app/todo-cards/components/Pricing.tsx
@@ -28,8 +28,17 @@ export async function Pricing() {
const discount = discountPercent(product.price, product.compareAtPrice);
const taxRate = effectiveTaxRate(product, defaultTaxRate);
// Same "any vs. every" split as ProductGrid.tsx/ProductSpotlight.tsx.
- const fullyOutOfStock = product.variants.length > 0 ? product.variants.every((v) => v.outOfStock) : product.outOfStock;
- const anyLowStock = product.variants.length > 0 ? product.variants.some((v) => v.lowStock) : product.lowStock;
+ // A deactivated product (product.active === false) isn't caught by
+ // either — the shop grid/spotlight filter those out before they'd ever
+ // reach this page, but this page resolves a product regardless of
+ // active status (existing links to it should still 200, see
+ // mapPayloadProduct's own comment in lib/payload.ts) — so it needs its
+ // own explicit check here to read as "Ausverkauft" rather than fully
+ // buyable (fixed 2026-07-24, feedback: deactivated should look
+ // sold-out on its own detail page).
+ const fullyOutOfStock =
+ !product.active || (product.variants.length > 0 ? product.variants.every((v) => v.outOfStock) : product.outOfStock);
+ const anyLowStock = product.active && (product.variants.length > 0 ? product.variants.some((v) => v.lowStock) : product.lowStock);
return (
@@ -100,12 +109,17 @@ export async function Pricing() {
this is an add-to-cart step, not the actual payment step, so
a payment-security reassurance is premature here and just
duplicates the one shown later at checkout. */}
+ {/* variants={[]} when deactivated — AddToCartButton's own
+ outOfStock prop is ignored whenever variants is non-empty (it
+ defers to each variant's own outOfStock flag instead, see its
+ currentlyOutOfStock calc), so a deactivated product with
+ in-stock variants would otherwise still render as buyable. */}
diff --git a/app/todo-cards/components/TodoKartenHero.tsx b/app/todo-cards/components/TodoKartenHero.tsx
index 2bc5e29..e099bf5 100644
--- a/app/todo-cards/components/TodoKartenHero.tsx
+++ b/app/todo-cards/components/TodoKartenHero.tsx
@@ -41,7 +41,9 @@ export async function TodoKartenHero() {
const discount = product ? discountPercent(product.price, product.compareAtPrice) : null;
const taxRate = product ? effectiveTaxRate(product, defaultTaxRate) : null;
// Same "any vs. every" split as ProductGrid.tsx/Pricing.tsx.
- const anyLowStock = product ? (product.variants.length > 0 ? product.variants.some((v) => v.lowStock) : product.lowStock) : false;
+ const anyLowStock = product
+ ? product.active && (product.variants.length > 0 ? product.variants.some((v) => v.lowStock) : product.lowStock)
+ : false;
return (