import { css, html } from "lit";
import { BaseElement } from "../../core/base-element.ts";
/**
* CFScreen - Full height screen layout component with header/main/footer slots
*
* @element cf-screen
*
* @slot header - Fixed header content at the top
* @slot main - Main content that expands to fill available space (default slot)
* @slot footer - Fixed footer content at the bottom
*
* @cssprop --cf-screen-footer-overlap - Distance the main scroller overlaps into reserved inset footer space. Increase this to move the fade lower into the footer region.
* @cssprop --cf-screen-footer-fade-height - Height of the main content fade at the bottom of the overlapped scroller region.
*
* @example
*
* Title
* Expandable content
* Footer
*
*/
export class CFScreen extends BaseElement {
static override styles = css`
:host {
/* Internal fallback defaults for footer tab-bar overlap and fade. */
--_cf-screen-footer-overlap-default: 4rem;
--_cf-screen-footer-fade-height-default: 2rem;
display: flex;
flex-direction: column;
height: 100%;
overflow: hidden;
box-sizing: border-box;
}
.header {
flex: none;
}
.main {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
overflow-y: auto;
overflow-x: hidden;
}
:host([data-footer-fade]) .main {
--_cf-screen-footer-overlap: var(
--cf-screen-footer-overlap,
var(
--cf-tab-bar-height,
var(--_cf-screen-footer-overlap-default)
)
);
--_cf-screen-footer-fade-height: var(
--cf-screen-footer-fade-height,
var(--_cf-screen-footer-fade-height-default)
);
margin-bottom: calc(-1 * var(--_cf-screen-footer-overlap));
padding-bottom: var(--_cf-screen-footer-overlap);
-webkit-mask-image: linear-gradient(
to bottom,
black 0,
black calc(100% - var(--_cf-screen-footer-fade-height)),
transparent 100%
);
mask-image: linear-gradient(
to bottom,
black 0,
black calc(100% - var(--_cf-screen-footer-fade-height)),
transparent 100%
);
}
.footer {
flex: none;
}
`;
override firstUpdated() {
this._syncFooterFade();
}
private _syncFooterFade = () => {
const footerSlot = this.shadowRoot?.querySelector(
'slot[name="footer"]',
);
const hasFooterFade = footerSlot?.assignedElements({ flatten: true }).some(
(element) =>
element.localName === "cf-tab-bar" &&
element.getAttribute("variant") === "inset" &&
element.getAttribute("position") !== "top",
) ?? false;
this.toggleAttribute("data-footer-fade", hasFooterFade);
};
override render() {
return html`
`;
}
}