/** * selectMobileTabs — pure tab-selection logic for the installed-app bottom * tab bar. No React, no DOM; unit-tested in `src/chrome/__tests__`. */ /** The minimal shape the selector needs; any nav item satisfies it. */ export interface MobileTabCandidate { id: string; path: string; /** Lower = more important. Items with a priority are promoted before items without. */ mobilePriority?: number; /** Registry order (tie-breaker after priority). */ order?: number; children?: MobileTabCandidate[]; } export interface MobileTabSelection { /** Items shown as bottom tabs, in display order. */ tabs: T[]; /** Everything else (goes into the "More" sheet), in registry order. */ more: T[]; /** Convenience: true when `more` is non-empty (a "More" tab is needed). */ hasMore: boolean; } /** * Pick the bottom tabs from a list of TOP-LEVEL nav items. * * - Only the items passed in are considered (children are never promoted to * tabs — callers pass the top level of the visible tree). * - Items with `mobilePriority` come first, ascending; ties and the rest keep * the incoming order (which the visibility pipeline has already sorted by * `order`), with `order` as a stable tie-breaker. * - Persona "N more…" synthetic parents (`__nav_more__:*`) are never tabs — * they always live in the More sheet. * - When the list does not fit, `maxTabs` slots are kept for real tabs and * the caller renders a "More" tab in addition; when everything fits, `more` * is empty and no More tab is needed. */ export declare function selectMobileTabs(items: readonly T[], maxTabs?: number): MobileTabSelection; /** * Path a tab navigates to: parents prefer their `homePath` (same rule as the * collapsed sidebar), then the first child, then their own path. */ export declare function resolveTabPath(item: T): string; //# sourceMappingURL=selectTabs.d.ts.map