/** Primary hub scrollport — set on `PrimaryPageTemplate` body wrapper in apps/web. */ declare const PAGE_SCROLL_ATTR = "data-page-scroll"; /** Breadcrumb / site chrome — bottom edge is the table sticky-header pin line. */ declare const SITE_HEADER_ATTR = "data-site-header"; /** Compact / comfort utility bar — sits above `[data-page-scroll]`. */ declare const UTILITY_BAR_SLOT = "utility-bar"; /** * Sticky subheaders inside the page scrollport (under the utility bar). * Layer stack while scrolling a hub/detail: utility (outside) → these (z-40) * → floating table head (portaled, z-50). Must sit above DataTable pinned * cells (z-20) so row content cannot paint through tab labels. */ declare const STICKY_SUBHEADER_SLOTS: readonly ["tabs-sticky-subheader", "list-views-sticky-subheader"]; /** * The element that vertically scrolls hub page content (not `window`). * Falls back to `#main-content` for legacy shells. */ declare function getPageScrollElement(): HTMLElement | null; /** * Viewport Y of the bottom of shell chrome that body-portaled floating * windows must stay below (utility bar, optional system banner). * * Prefers the live top of `[data-page-scroll]` when that canvas has already * cleared the bar. Falls back to the bar's own bottom, then 0 when the * shell has no bar (exam lock / focus workflows). */ declare function getShellChromeBottomPx(): number; /** * Viewport Y where floating table column headers should pin. * * Prefers live geometry: * 1. Top of `[data-page-scroll]` (canvas under the utility bar) * 2. Bottom of a real `SiteHeader` when it is stuck in the top pin band * 3. Bottom of sticky subheaders (module tabs / hub view toolbar) stacked * under that band — matched against the running offset, not only * `portTop`, so a strip with margin/`top` offset still counts * 4. `--header-height` as last resort * * Ignores zero-height `data-site-header` shells (Compact portals the trail * into the utility bar and leaves an empty wrapper that must not affect pin). */ declare function getStickyTableHeaderOffset(): number; /** Subscribe to vertical scroll sources that move tables relative to the viewport. */ declare function bindVerticalScrollListeners(onScroll: () => void): () => void; export { PAGE_SCROLL_ATTR, SITE_HEADER_ATTR, STICKY_SUBHEADER_SLOTS, UTILITY_BAR_SLOT, bindVerticalScrollListeners, getPageScrollElement, getShellChromeBottomPx, getStickyTableHeaderOffset };