diff --git a/src/app/search/SearchResultsClient.tsx b/src/app/search/SearchResultsClient.tsx index 356c3b2bf..521c74a57 100644 --- a/src/app/search/SearchResultsClient.tsx +++ b/src/app/search/SearchResultsClient.tsx @@ -445,7 +445,11 @@ function SearchCard({ product }: { product: SearchCardProduct }) { onError={() => { setImageError(true); }} - className="relative z-10 block h-full w-full max-h-[220px] object-contain p-2 transition-transform duration-300 group-hover:scale-[1.03]" + // BUY-64266: drop group-hover:scale-[1.03] which pushed the rightmost + // card image beyond the grid column on desktop. Keep BUY-64736's + // max-h-[220px] / max-w-full / object-contain bounds so the image + // can never exceed its 220px-tall card frame. + className="relative z-10 block h-full w-full max-h-[220px] max-w-full object-contain p-2" style={{ maxHeight: '220px', width: '100%', objectFit: 'contain' }} /> ) : imageError || !product.imageUrl ? ( diff --git a/src/components/ProductCard.tsx b/src/components/ProductCard.tsx index b831ec07c..22aa1eae9 100644 --- a/src/components/ProductCard.tsx +++ b/src/components/ProductCard.tsx @@ -140,21 +140,22 @@ export const ProductCard = React.memo(function ProductCard({ deal, comparisonEna rel="noopener noreferrer" className="group block bg-white rounded-xl border border-gray-100 overflow-hidden hover:shadow-lg hover:border-indigo-100 transition-all duration-200" > -
-
+
+
{deal.image_url ? ( {deal.name} ) : ( - {config.icon} +
+ {config.icon} +
)}
{deal.discount_pct && deal.discount_pct > 0 && ( diff --git a/src/components/seo/SeoLandingPage.tsx b/src/components/seo/SeoLandingPage.tsx index 37e0d5bdd..96efdba57 100644 --- a/src/components/seo/SeoLandingPage.tsx +++ b/src/components/seo/SeoLandingPage.tsx @@ -145,7 +145,7 @@ export async function SeoLandingPage({ config }: { config: SeoLandingPageConfig
-
+
{config.heroEyebrow}

@@ -154,17 +154,25 @@ export async function SeoLandingPage({ config }: { config: SeoLandingPageConfig

{config.heroBody}

-
    -
  • - + {/* + BUY-66322: single-column layout for the hero checkmark list. + The previous `flex flex-wrap gap-x-6 gap-y-2` layout could wrap + to two rows on narrow/mid viewports, leaving a perceived empty + bottom-right cell (VidMee layout flag). A vertical stack is + unambiguous and matches the editorial intent (page metadata, + not a feature grid). + */} +
      +
    • + {buildRefreshedLabel(config, products)}
    • -
    • - +
    • + {config.country} market coverage
    • -
    • - +
    • + Live BuyWhere search results
    @@ -177,7 +185,7 @@ export async function SeoLandingPage({ config }: { config: SeoLandingPageConfig
    {shopperCta.label} @@ -196,10 +204,10 @@ export async function SeoLandingPage({ config }: { config: SeoLandingPageConfig
    -

    Live catalog snapshot

    +

    Live catalog snapshot

    {config.productSectionTitle}

    - + Open full search
    @@ -275,7 +283,7 @@ export async function SeoLandingPage({ config }: { config: SeoLandingPageConfig
    -

    {config.categoryComparisonEyebrow || "Featured models"}

    +

    {config.categoryComparisonEyebrow || "Featured models"}

    {config.categoryComparisonTitle || "Models compared"}

    @@ -313,7 +321,7 @@ export async function SeoLandingPage({ config }: { config: SeoLandingPageConfig
    -

    Buying signals

    +

    Buying signals

    {config.highlightSectionTitle}

    {config.highlights.map((highlight) => ( @@ -332,7 +340,7 @@ export async function SeoLandingPage({ config }: { config: SeoLandingPageConfig
      {config.advicePoints.map((point) => (
    • - + {point}