import { ToolbarSlot } from './ToolbarRows'; import { DynamicToolbarAction, ResolveToolbarActionWidth } from './planToolbarActions'; export type ToolbarLayoutMode = 'compact' | 'stacked' | 'selection-split' | 'inline'; export interface ToolbarLayoutResolution { mode: ToolbarLayoutMode; filterIconOnly: boolean; trailingIconOnly: boolean; } /** * Real, rendered widths measured by DynamicToolbar. Every field is optional: * a missing value falls back to the heuristic estimate, so layout planning * works on first render and degrades gracefully. */ export interface MeasuredToolbarWidths { titleWidthPx?: number; leadingUtilityWidthPx?: number; searchWidthPx?: number; filterLabelWidthPx?: number; filterIconWidthPx?: number; trailingLabelWidthPx?: number; trailingIconWidthPx?: number; selectionIndicatorWidthPx?: number; moreButtonWidthPx?: number; actionWidthPx?: ResolveToolbarActionWidth; } export declare function estimateTitleAreaWidth(title?: ToolbarSlot): number; /** * Width reserved for the title area. Prefers the measured natural width * (capped — the title is allowed to truncate rather than dominate layout), * falling back to the character-count estimate before measurement. */ export declare function resolveTitleAreaWidth(title: ToolbarSlot | undefined, measuredTitleWidthPx?: number): number; export declare function estimateActionsStripWidth(actions: DynamicToolbarAction[], showLabel: boolean, resolveActionWidth?: ResolveToolbarActionWidth): number; /** * Bulk zone width as it actually renders: the top-priority actions inline * (labels always shown) up to `maxVisibleBulkActions`, plus the More trigger * when the remaining actions overflow into the menu. */ export declare function estimateBulkStripWidth(bulkActions: DynamicToolbarAction[], maxVisibleBulkActions: number, resolveActionWidth?: ResolveToolbarActionWidth): number; export declare function resolveReserveBulkActionsWidthPx(reserveBulkActionsWidthPx: number, bulkActions: DynamicToolbarAction[], resolveActionWidth?: ResolveToolbarActionWidth, maxVisibleBulkActions?: number): number; export interface EstimateUtilitiesWidthOptions { hasLeadingUtility: boolean; hasFilter: boolean; hasSearch: boolean; hasTrailingUtility: boolean; showPageActions: boolean; showBulkActions: boolean; filterIconOnly: boolean; trailingIconOnly: boolean; pageActionsWidthPx: number; bulkActionsWidthPx: number; /** §4/§7: search before filter on utility row */ searchBeforeFilter?: boolean; measured?: MeasuredToolbarWidths; } export declare function estimateUtilitiesClusterWidth(options: EstimateUtilitiesWidthOptions): number; export declare function resolveToolbarLayout(options: { containerWidth: number; isMobile: boolean; isSelectionMode: boolean; compactBreakpointPx: number; reserveBulkActionsWidthPx: number; title?: ToolbarSlot; hasLeadingUtility: boolean; hasFilter: boolean; hasSearch: boolean; hasTrailingUtility: boolean; pageActions: DynamicToolbarAction[]; bulkActions: DynamicToolbarAction[]; maxVisibleBulkActions?: number; measured?: MeasuredToolbarWidths; }): ToolbarLayoutResolution; /** Width budget for `planToolbarActions` based on resolved layout. */ export declare function resolvePageActionsAvailableWidth(options: { layoutMode: ToolbarLayoutMode; containerWidth: number; titleWidth: number; filterIconOnly: boolean; trailingIconOnly: boolean; hasFilter: boolean; hasSearch: boolean; hasLeadingUtility: boolean; hasTrailingUtility: boolean; reserveBulkActionsWidthPx: number; measured?: MeasuredToolbarWidths; }): number; export declare function resolveBulkActionsAvailableWidth(options: { layoutMode: ToolbarLayoutMode; containerWidth: number; titleWidth: number; filterIconOnly: boolean; hasFilter: boolean; hasSearch: boolean; measured?: MeasuredToolbarWidths; }): number;