import React from 'react'; import type { ActionsMenuGroup } from '../ui/actions-menu'; import { type PageActionButton } from '../ui/page-actions'; /** * Minimum height of the title block's content column, matched to the action * button height: the icon button on mobile (`h-11` → 44px) and the default * button on desktop (`md:h-12` → 48px). Applied to the inner title column (which * has no padding) rather than the root — the root's `pt`/`mb` are box-sizing * border-box and would otherwise absorb the floor. Keeps the header a consistent * height across pages whether or not they render action buttons, so the content * below starts at the same baseline. Exported so other page chrome can reuse it. */ export declare const TITLE_BLOCK_MIN_HEIGHT = "min-h-11 md:min-h-12"; export interface TitleBlockProps { title?: string; subtitle?: string; image?: { src: string; alt?: string; }; backButton?: { label?: string; onClick: () => void; }; actions?: PageActionButton[]; actionsVariant?: 'icon-buttons' | 'primary-buttons' | 'menu-primary'; menuActions?: ActionsMenuGroup[]; /** Desktop-only slot (e.g. a `TabSelector`) rendered with the actions. Hidden on mobile. */ selector?: React.ReactNode; /** * Visual variant. * - `plain` (default): transparent background, no border. * - `card`: card background, border, and padding on mobile only — collapses to plain on md+. */ variant?: 'plain' | 'card'; className?: string; /** Title typography size. Default `'h2'` (the frozen baseline). Pass `'h1'` to * opt the title up to `text-h1` (the unified Help Center pages). Subtitle stays * `text-h6` either way. */ titleSize?: 'h1' | 'h2'; /** Optional node rendered inline, immediately after the title (e.g. a status `Tag`). * Additive + default-preserving: omit it and every existing caller is byte-identical. */ titleAdornment?: React.ReactNode; /** When true, the title/subtitle TEXT is replaced by line-box-accurate skeleton bars * (typography + surrounding markup unchanged, so header height is identical to loaded). * Additive + default-preserving: omit it and every existing caller is byte-identical. */ loading?: boolean; /** * Render the ACTIONS as placeholders too. Separate from `loading` on purpose: * a page whose action set is already final (it depends on the route, not on * the record) keeps showing its real buttons while the title loads. */ loadingActions?: boolean; /** * When the subtitle row occupies the layout. The subtitle is often optional * RECORD data — unknown while loading, sometimes absent afterwards — and there * is no setting that both fills the loading header and never leaves a blank * line, so the caller picks which one matters. * * - `'when-set'` (default) — only when `subtitle` has text. * - `'while-loading'` — also during `loading`, as a skeleton bar. The header * looks complete while it loads, and the row collapses if the record turns * out to have no subtitle (so that case settles one line shorter). * - `'always'` — the row never collapses; an empty subtitle holds its line * with an invisible spacer. The header cannot change height. Use it when the * loaded page ALWAYS has a subtitle — typically a standalone skeleton * component matching a page whose subtitle is guaranteed. */ subtitleRow?: 'when-set' | 'while-loading' | 'always'; /** When true, a long title WRAPS onto multiple lines instead of the frozen single-line * ellipsis clamp. For content detail pages whose h1 is CMS data of arbitrary length. * Additive + default-preserving: omit it and every existing caller is byte-identical. */ titleWrap?: boolean; } export declare function TitleBlock({ title, subtitle, image, backButton, actions, actionsVariant, menuActions, selector, variant, className, titleSize, titleAdornment, loading, loadingActions, subtitleRow, titleWrap, }: TitleBlockProps): React.JSX.Element; export default TitleBlock; //# sourceMappingURL=title-block.d.ts.map