.block-articles {
  --padding-inline: calc(
    var(--article-card-shadow-offset-x) + var(--article-card-shadow-blur)
  );

  position: relative;
  padding-block: calc(
    var(--article-card-shadow-offset-y) + var(--article-card-shadow-blur)
  );
  padding-inline: var(--padding-inline);
  scroll-snap-type: x mandatory;
  scroll-padding-inline: var(--padding-inline);
  scrollbar-width: none;
  background-color: rgb(var(--color-background));
  scroll-behavior: smooth;
}

.block-articles > li {
  flex-shrink: 0;
  scroll-snap-align: start;
}

.block-articles__carousel {
  width: 100%;
}

.block-articles__dots {
  margin-block-start: 30px;
}

.block-articles__progress {
  margin: 20px 0;
}

@media (max-width: 959px) {
  .block-articles {
    width: calc(100% + var(--page-padding) * 2);
    padding-inline: var(--page-padding);
    margin-inline: calc(-1 * var(--page-padding));
    overflow-y: hidden;
    scroll-padding-inline: var(--page-padding);
  }
}

/* TF fix (20 Sep 2026): the blog section's alignment setting emits
   `margin-left:0 !important; margin-right:auto !important` from an ID selector,
   which defeats the full-bleed rule above and pushes the carousel 20px past the
   right edge of the viewport — giving every page that renders this section a
   horizontal scroll on mobile. `:is(#tf-spec, .block-articles)` borrows ID
   specificity so the intended negative margins win. Desktop (>=960px) untouched. */
@media (max-width: 959px) {
  :is(#tf-spec, .block-articles).carousel__track.grid {
    margin-left: calc(-1 * var(--page-padding)) !important;
    margin-right: calc(-1 * var(--page-padding)) !important;
  }
}