import * as React from "react"; import type { AppLauncherProp } from "../../props/components/layout.prop.js"; export type { AppLauncherApp, AppLauncherGroup, AppLauncherLabels, AppLauncherProp, AppLauncherProp as AppLauncherProps, } from "../../props/components/layout.prop.js"; /** Arbitrary `data-*` hooks — the one escape hatch this closed component keeps open. */ type DataAttributes = { [key: `data-${string}`]: string | number | boolean | undefined; }; /** * AppLauncher — the nine-dot app grid in the topbar: the platform's standard way to change app. * * THE TRIGGER IS A `TopbarItem`, NOT A `Button`. A bar cell is as tall as the bar, its hover IS the * bar's surface, and its focus mark is hosted inside it; a `Button variant="ghost"` in the same slot * draws a `--control-height` pill floating in a taller strip, with its own hover fill and its own * ring drawn around that pill. That was the 20.0.0 correction, and it is why nothing here emits a * height: the cell stretches to whatever the bar's height happens to be (`--app-shell-bar-height`, * `--topbar-height`, or the coarse-pointer override), so it names none of them. * * The panel is the SAME responsive contract as `OrgSwitcher`: a desktop popover above * `--sheet-responsive-breakpoint-width` and a focus-trapped bottom Sheet at/below it, through the * shared `useSheetResponsiveMode()` hook rather than a component-local media query. * * ## Related — two components this is repeatedly confused with * * - `ServiceLauncherCard` (data-display) is a launcher tile too, but a PAGE-SIZED one: status, * hostname, plan, an action button, a reason it is locked. It belongs on a service-catalogue page, * where choosing is a considered act. The tile here is bar-sized — mark plus name, the whole tile * one link — because changing app is a reflex. Neither is built out of the other, and a grid of * `ServiceLauncherCard`s inside a popover is the wrong component, not a smaller version of this. * - `AppShellProp.navRail` says the SAME platform scope as a docked column. Pick ONE: the launcher * for a platform with MANY apps where switching is occasional (Google Workspace), the rail for a * single product where switching workspace is constant enough to be worth permanent screen width * (Slack). Shipping both puts one scope in two places and makes neither authoritative. */ export declare function AppLauncher({ apps, groups, labels, columns, linkComponent, loading, error, onRetry, responsive, appearance, side, align, open, onOpenChange, className, ...rest }: AppLauncherProp & Pick, "id"> & DataAttributes): React.JSX.Element;