/**
 * Clamp product card descriptions to 4 lines across Divi Woo Products,
 * Divi Shop, WooCommerce archives, related products, and AJAX filter grids.
 *
 * The shop loop prints the description inside .et_pb_text_inner (see
 * divi_child_show_short_desc_related in we-custom-functions.php). Related
 * and native WC loops may use a <p> directly under li.product.
 *
 * We rely on -webkit-line-clamp alone for the cutoff — it ellipsizes at the
 * 4th line without a fixed max-height, which avoids clipping descenders or
 * wrapping differently on narrow viewports.
 */
ul.products li.product .et_pb_text .et_pb_text_inner,
.et_pb_wc_products ul.products li.product > p,
.et_pb_shop ul.products li.product > p,
.woocommerce ul.products li.product > p,
ul.products li.product > p.woocommerce-loop-product__description,
.related.products ul.products li.product > p,
.harps-related-products ul.products li.product > p {
    display: -webkit-box !important;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 4;
    line-clamp: 4;
    overflow: hidden;
    text-overflow: ellipsis;
    margin-bottom: 0;
}

/* Reserve equal vertical space only when cards sit side-by-side. On mobile
   (single-column), we let each card size to its own content so short
   descriptions don't leave a gap and longer ones aren't clipped. */
@media (min-width: 768px) {
    ul.products li.product .et_pb_text .et_pb_text_inner,
    .et_pb_wc_products ul.products li.product > p,
    .et_pb_shop ul.products li.product > p,
    .woocommerce ul.products li.product > p,
    ul.products li.product > p.woocommerce-loop-product__description,
    .related.products ul.products li.product > p,
    .harps-related-products ul.products li.product > p {
        min-height: calc(1.6em * 4);
    }
}
