/*
 * Shared text rhythm — keep this boundary sheet after component styles.
 * A single token controls label -> heading -> description in every text stack.
 * CSS millimetres are reference-pixel units, not a physical display measurement.
 * Only adjacent in-flow text is affected; no line-height, font, media, shell or
 * section padding is changed. Existing grid/flex gaps are counted exactly once.
 */
:root { --ibmcp-text-stack-gap: 5mm; }

/* Reset on EACH node: nested stacks must not inherit their outer grid's gap. */
.ibmcp-section :where(*) { --ibmcp-text-parent-gap: 0px; }

/* Authored one-column text grids. Keep their horizontal layout and outer gaps. */
.ibmcp-section.ibmcp-section :is(.ibmcp-section-heading, .ibmcp-stylist-case-head, .ibmcp-stylist-case-card-copy, .ibmcp-character-case-fact, .ibmcp-wardrobe-roles-copy, .ibmcp-visible-change-facts > div, .ibmcp-columns-heading, .ibmcp-partner-logos-heading, .ibmcp-locations-heading, .ibmcp-blog-card-copy) {
  row-gap: var(--ibmcp-text-stack-gap);
}
.ibmcp-section.ibmcp-section :is(.ibmcp-section-heading, .ibmcp-stylist-case-head, .ibmcp-stylist-case-card-copy, .ibmcp-character-case-fact, .ibmcp-wardrobe-roles-copy, .ibmcp-visible-change-facts > div, .ibmcp-columns-heading, .ibmcp-partner-logos-heading, .ibmcp-locations-heading, .ibmcp-blog-card-copy) > * {
  --ibmcp-text-parent-gap: var(--ibmcp-text-stack-gap);
}

/* Mixed content: retain the user's column/media/form geometry. Only cancel the
 * parent gap at a label/title/description boundary, rather than adding to it. */
.ibmcp-section.ibmcp-section .ibmcp-column > * {
  --ibmcp-text-parent-gap: var(--ibmcp-col-item-gap-desktop, 18px);
}
.ibmcp-section.ibmcp-section .ibmcp-location-copy > * { --ibmcp-text-parent-gap: 24px; }

.ibmcp-section.ibmcp-section :is(.ibmcp-service-card, .ibmcp-pricing-card) > * {
  --ibmcp-text-parent-gap: clamp(16px, calc(1.7 * var(--ibmcp-layout-vw, 1vw)), 24px);
}

/* Clear the PRECEDING bottom margin; otherwise block margins collapse whereas
 * grid/flex margins add up, creating different spaces for identical content. */
.ibmcp-section.ibmcp-section :is(.ibmcp-kicker, .ibmcp-subtitle, .ibmcp-script-kicker, .ibmcp-stylist-label, .ibmcp-stylist-case-label, .ibmcp-blog-topic, .ibmcp-pricing-badge, .ibmcp-process-number, .ibmcp-visible-change-copy-kicker, .ibmcp-stylist-case-topline, .ibmcp-visible-change-kicker, .ibmcp-wardrobe-role-caption, .ibmcp-manifesto-quote, .ibmcp-media-caption, .ibmcp-signature):not(:empty):has(+ :is(h1, h2, h3, h4, h5, h6, .ibmcp-display-title, .ibmcp-character-case-value, .ibmcp-visible-change-fact-title, .ibmcp-contact-email, .ibmcp-pricing-price):not(:empty)),
.ibmcp-section.ibmcp-section :is(h1, h2, h3, h4, h5, h6, .ibmcp-display-title, .ibmcp-character-case-value, .ibmcp-visible-change-fact-title, .ibmcp-contact-email, .ibmcp-pricing-price):not(:empty):has(+ :is(p, .ibmcp-richtext, .ibmcp-stylist-card-text, .ibmcp-stylist-case-card-text, .ibmcp-location-detail, .ibmcp-facts-list, .ibmcp-visible-change-facts, .ibmcp-stylist-subtitle, .ibmcp-stylist-script, .ibmcp-subtitle, .ibmcp-hero-subtitle):not(:empty)) {
  margin-block-end: 0;
}

/* One shared rule for both boundaries — independent of font size and device. */
.ibmcp-section.ibmcp-section :is(.ibmcp-kicker, .ibmcp-subtitle, .ibmcp-script-kicker, .ibmcp-stylist-label, .ibmcp-stylist-case-label, .ibmcp-blog-topic, .ibmcp-pricing-badge, .ibmcp-process-number, .ibmcp-visible-change-copy-kicker, .ibmcp-stylist-case-topline, .ibmcp-visible-change-kicker, .ibmcp-wardrobe-role-caption, .ibmcp-manifesto-quote, .ibmcp-media-caption, .ibmcp-signature):not(:empty) + :is(h1, h2, h3, h4, h5, h6, .ibmcp-display-title, .ibmcp-character-case-value, .ibmcp-visible-change-fact-title, .ibmcp-contact-email, .ibmcp-pricing-price):not(:empty),
.ibmcp-section.ibmcp-section :is(h1, h2, h3, h4, h5, h6, .ibmcp-display-title, .ibmcp-character-case-value, .ibmcp-visible-change-fact-title, .ibmcp-contact-email, .ibmcp-pricing-price):not(:empty) + :is(p, .ibmcp-richtext, .ibmcp-stylist-card-text, .ibmcp-stylist-case-card-text, .ibmcp-location-detail, .ibmcp-facts-list, .ibmcp-visible-change-facts, .ibmcp-stylist-subtitle, .ibmcp-stylist-script, .ibmcp-subtitle, .ibmcp-hero-subtitle):not(:empty) {
  margin-block-start: calc(var(--ibmcp-text-stack-gap) - var(--ibmcp-text-parent-gap));
}

/* A service/price description may be a list rather than a paragraph. */
.ibmcp-section.ibmcp-section :is(.ibmcp-service-card, .ibmcp-pricing-card) > h3:has(+ ul) { margin-block-end: 0; }
.ibmcp-section.ibmcp-section :is(.ibmcp-service-card, .ibmcp-pricing-card) > h3 + ul {
  margin-block-start: calc(var(--ibmcp-text-stack-gap) - var(--ibmcp-text-parent-gap));
}

/* The wardrobe subtitle is beside its title on wide layouts, not underneath it. */
.ibmcp-section.ibmcp-section .ibmcp-wardrobe-roles-head > .ibmcp-wardrobe-roles-subtitle {
  margin-block-start: 0;
}

@media (min-width:681px) and (max-width:980px) {
:where(html:not([data-ibmcp-boxed])) .ibmcp-section.ibmcp-section .ibmcp-column > * { --ibmcp-text-parent-gap: var(--ibmcp-col-item-gap-tablet, 18px); }
:where(html:not([data-ibmcp-boxed])) .ibmcp-section.ibmcp-section .ibmcp-character-detail { grid-template-rows: repeat(3, min-content) minmax(0, 1fr); }
:where(html:not([data-ibmcp-boxed])) .ibmcp-section.ibmcp-section .ibmcp-character-detail > * { --ibmcp-text-parent-gap: 20px; }
}
:where(html[data-ibmcp-boxed][data-ibmcp-layout-media~="min681"][data-ibmcp-layout-media~="max980"]) .ibmcp-section.ibmcp-section .ibmcp-column > * { --ibmcp-text-parent-gap: var(--ibmcp-col-item-gap-tablet, 18px); }
:where(html[data-ibmcp-boxed][data-ibmcp-layout-media~="min681"][data-ibmcp-layout-media~="max980"]) .ibmcp-section.ibmcp-section .ibmcp-character-detail { grid-template-rows: repeat(3, min-content) minmax(0, 1fr); }
:where(html[data-ibmcp-boxed][data-ibmcp-layout-media~="min681"][data-ibmcp-layout-media~="max980"]) .ibmcp-section.ibmcp-section .ibmcp-character-detail > * { --ibmcp-text-parent-gap: 20px; }

@media (max-width:680px) {
:where(html:not([data-ibmcp-boxed])) .ibmcp-section.ibmcp-section .ibmcp-column > * { --ibmcp-text-parent-gap: var(--ibmcp-col-item-gap-mobile, 18px); }
:where(html:not([data-ibmcp-boxed])) .ibmcp-section.ibmcp-section .ibmcp-location-copy > * { --ibmcp-text-parent-gap: 20px; }
:where(html:not([data-ibmcp-boxed])) .ibmcp-section.ibmcp-section .ibmcp-wardrobe-roles-head > .ibmcp-wardrobe-roles-subtitle { margin-block-start: 0; }
}
:where(html[data-ibmcp-boxed][data-ibmcp-layout-media~="max680"]) .ibmcp-section.ibmcp-section .ibmcp-column > * { --ibmcp-text-parent-gap: var(--ibmcp-col-item-gap-mobile, 18px); }
:where(html[data-ibmcp-boxed][data-ibmcp-layout-media~="max680"]) .ibmcp-section.ibmcp-section .ibmcp-location-copy > * { --ibmcp-text-parent-gap: 20px; }
:where(html[data-ibmcp-boxed][data-ibmcp-layout-media~="max680"]) .ibmcp-section.ibmcp-section .ibmcp-wardrobe-roles-head > .ibmcp-wardrobe-roles-subtitle { margin-block-start: 0; }
