/* Page-shell contract: the final page footer ends the active viewport/content.
 * A direct footer or a direct child containing a footer identifies a page shell.
 * Hidden dialogs/helpers may follow the footer in DOM order.
 * Embedded application viewports keep their own scroll and footer ownership.
 * New pages may use a semantic footer or data-page-footer; v9 is a legacy alias. */
.site-page:not([hidden]):not(.embedded-page):has(> :is(footer,[data-page-footer],.v9-page-foot)),
.site-page:not([hidden]):not(.embedded-page):has(> * > :is(footer,[data-page-footer],.v9-page-foot)) {
  display:flex;
  flex-direction:column;
  padding-bottom:0;
}
.site-page:not([hidden]):not(.embedded-page) > :has(> :is(footer,[data-page-footer],.v9-page-foot)) {
  display:flex;
  flex-direction:column;
  flex:1 0 auto;
  padding-bottom:0;
}
.site-page:not([hidden]):not(.embedded-page):has(> :is(footer,[data-page-footer],.v9-page-foot)) > *,
.site-page:not([hidden]):not(.embedded-page) > :has(> :is(footer,[data-page-footer],.v9-page-foot)) > * {
  flex-shrink:0;
}
/* Put unused viewport space before the existing footer, retaining its margin. */
.site-page:not([hidden]):not(.embedded-page):has(> :is(footer,[data-page-footer],.v9-page-foot))::after,
.site-page:not([hidden]):not(.embedded-page) > :has(> :is(footer,[data-page-footer],.v9-page-foot))::after {
  content:"";
  flex:1 0 0px;
  order:1;
}
.site-page:not([hidden]):not(.embedded-page) > :is(footer,[data-page-footer],.v9-page-foot),
.site-page:not([hidden]):not(.embedded-page) > :has(> :is(footer,[data-page-footer],.v9-page-foot)) > :is(footer,[data-page-footer],.v9-page-foot) {
  order:2;
}

/* Writing pages may own outer gutters or leave them to their main.
 * Bound a direct shared footer to the viewport gutters and available parent
 * width, so both structures share the same inset without stacking gutters. */
.site-page:not([hidden]):not(.embedded-page).launch-page > :is(footer,[data-page-footer],.v9-page-foot) {
  width:min(1080px,calc(100vw - 48px));
  max-width:100%;
  margin-inline:auto;
}
@media(max-width:650px) {
  .site-page:not([hidden]):not(.embedded-page).launch-page > :is(footer,[data-page-footer],.v9-page-foot) {
    width:min(1080px,calc(100vw - 44px));
  }
}
