import { type ReactNode } from "react"; /** Long enough for cursor travel from the element to the pill, short enough * that the pill does not linger over the page. Shared with `` * (remixable.tsx), which wears the same marks — two copies of this number is * two blooms that can drift apart. */ export declare const GRACE_MS = 200; /** Every ✦ popover dismisses like any menu: Escape, or pointer-down outside * it. Returns the ref that marks "inside". Shared with `` * (remixable.tsx), where it is touch's only way to put the mark away. */ export declare function useMenuDismiss(open: boolean, onToggle: (open: boolean) => void): import("react").RefObject; /** * The ONE ✦ menu — Edit in chat · Update · Revert — over any app the page is * showing on the person's behalf: one someone pinned into a host slot, and one * a `` component was remixed into (remixable.tsx mounts this same * chrome rather than a lookalike of it, so there is one ✦ vocabulary on the * page instead of two that almost match). * * Only `Revert` differs by owner, so only `Revert` is injected: a pinned app's * placement is unplaced, a remix's whole app is deleted. Both mean the same * thing to the person — the host's own markup comes back. * * REVEALED IS STATE, NOT `:hover`, for the reason Remixable documents: a * CSS-only reveal dies on the way to the pill, so the pill could never be * clicked. Touch has no hover at all, so a tap on the app reveals the seed and * a tap anywhere else puts it away. * * `useMenuDismiss` is scoped TWICE here, which is the whole of the touch * behavior: the popover closes on a press outside the popover, and the mark * only goes away on a press outside the APP, so tapping the app cannot undo the * tap that revealed it. */ export declare function PinChrome({ appId, title, context, state, sharing, onRefresh, onRevert, children }: { appId: string; /** What the app calls itself — the prefill names the THING, never an id. */ title: string; /** The grounding "Edit in chat" hands the agent — never rendered. */ context: string; /** An app that is NOT a finished screen. The mark reads `label`, answers to * `name`, and the menu announces `status` — because the ✦ sits over the * host's own original in both of those states, and a settled "Edit" over one * is the page claiming a screen that is not there. Absent is the ordinary * settled app. Vocabulary belongs to the caller: a remix that never built and * a pinned app that will not load are not the same sentence. */ state?: { label: string; name: string; status: string; busy?: boolean; }; /** The one share the ✦ offers: this caller's tenant, and whether the app is * already shared with it. Absent ⇒ no menu item (not an owner, or in no * tenant). */ sharing?: { org: string; display: string; shared: boolean; onToggle(next: boolean): Promise; }; onRefresh(): void; /** Undo this app's presence on the page; rejecting keeps the popover open. */ onRevert(): Promise; children: ReactNode; }): import("react").JSX.Element;