import { type ReactNode } from 'react'; /** * Who you are, and where you are — the top bar's identity trigger and the * menu it opens. Ship's IdentityMenu (2026-09-01), moved in whole: every app * needs one, and this one is already made of nothing but shared parts. * * The trigger is a face and a name, never a key (Ship's ruling A4) — or, with * `compact`, the face alone, as Peek's top bar draws it. Anonymous is a * silhouette and the word "Anonymous": the truth of the situation rather than * eight hex characters posing as a name. * * The menu keeps the two honest sentences, and the workspace line names the * relay because on this substrate the relay *is* the workspace. Every section * hides when the app cannot fill it: no `relayUrl`, no workspace section; no * `onCopyKey`, no copy item — only offer actions that can succeed. The one * place a key appears is as the *result* of "Copy public key" — this * component never receives the key, so it cannot show one; the caller * copies. Items are text only, no icons (her ruling). */ export interface Identity { /** From `kind:0`. Absent means anonymous. */ name?: string; picture?: string; /** Known to Estiva ID, never published to the relay. */ email?: string; } export interface IdentityMenuProps { me: Identity; /** Signed in through Estiva ID, as opposed to a browser-held key. */ signedIn: boolean; /** Names the workspace; absent hides the workspace section. */ relayUrl?: string; /** Estiva ID's base URL when this build offers sign-in; absent = anonymous-only build. */ idBase?: string; /** "Copy public key" appears only when the app can supply one. */ onCopyKey?: () => void; onSignOut?: () => void; /** Face-only trigger, 36px — no chevron, no name beside it. */ compact?: boolean; className?: string; /** * App-specific rows, drawn as their own group between the workspace * section and the actions. A function receives `close`, so a row can * shut the menu before opening what it opens. */ children?: ReactNode | ((close: () => void) => ReactNode); } /** * The menu alone, as a plain surface — what the docs canvases draw, and what * a surface that wants the rows without the menu can use. */ export interface IdentityPanelProps extends Omit { /** Called when a row asks the menu to close. */ onClose?: () => void; } /** The identity rows on a panel of their own, with no menu around them — for a * docs page, or anywhere the panel is already placed. `IdentityMenu` is the * same rows inside a real menu. */ export declare function IdentityPanel({ className, onClose, ...rest }: IdentityPanelProps): import("react").JSX.Element; /** The old name for the same thing. */ export declare const IdentityPanelSurface: typeof IdentityPanel; /** * The panel's contents, without the menu around them. * * Split out at stage 4 for the same reason `MenuPanel` was split out of * `Menu`: a real menu portals and places itself against a trigger, so it * cannot stand in a docs page, and the canvases must still show the artifact * (Katerina, D25). The stories draw these rows on a `MenuPanel`; the app gets * them inside a `Menu`. One definition either way. * * Not exported from the package — `IdentityMenu` and `IdentityPanel` are the * API; this is how they are built. */ export declare function IdentityRows({ me, signedIn, relayUrl, idBase, onCopyKey, onSignOut, onClose, children }: Omit & { onClose: () => void; }): import("react").JSX.Element; export declare function IdentityMenu({ me, signedIn, relayUrl, idBase, onCopyKey, onSignOut, compact, className, children }: IdentityMenuProps): import("react").JSX.Element; //# sourceMappingURL=IdentityMenu.d.ts.map