import React from 'react'; import { type CardProps } from './sidebar-card.js'; export interface SidebarPanelFrameProps { /** Accent color for the rail, title, and separator. */ accent: string; /** Header glyph, e.g. `glyphs.fleet` or `glyphs.sessions`. */ icon: string; /** Uppercase title (e.g. "FLEET", "PLAN", "AGENTS"). */ title: string; /** * Width allocated to this routed panel inside RightSidebar. The outer shell * owns the border and padding; this frame spends the full content width on * hierarchy and data. */ width: number; /** Optional quiet subtitle hidden on narrow terminals. */ kicker?: string | undefined; /** Optional right-aligned header content (status badge, counts, etc.). * Wrapped automatically in a pill chrome if `pillStatus` is supplied. */ right?: React.ReactNode | undefined; /** * When provided, the right-side header content is rendered through * `SidebarStatusPill` with the given color and label. Existing * `right={...}` callers still work; pass `pillLabel`+`pillColor` * for the new look without rewriting every call site. */ pillLabel?: string | undefined; pillColor?: string | undefined; /** Footer content (key hints, footer note). Renders under the body. */ footer?: React.ReactNode | undefined; /** * Body content. Pass a function to receive the Card's *body content width* * (the inset width after the Card's optional `│` sides and body padding, * not the outer card width). This mirrors the `Card` render prop and lets * `SidebarSectionHeader` / `SidebarStatRow` / `SidebarWorklistRow` size * their dotted leaders and metric columns to the actual available width * instead of over-shooting into the Card's side bars. */ children?: React.ReactNode | ((bodyWidth: number) => React.ReactNode) | undefined; } /** * Truncate a string to fit within `max` display columns, adding an ellipsis. * Exported so sibling sidebar panel files can use the same string-fitting * helper without pulling in sidebar-content.tsx's full implementation. */ export declare function trunc(s: string, max: number): string; /** * A "capsuled" status pill, e.g. `⟦ live 12 ⟧`. Used in panel headers * (right side) and stat rows. Renders inline — no Box, no flex — so it can * sit next to a label without burning a row of its own. */ export declare function SidebarStatusPill({ label, color, outlined, }: { label: string; color: string; /** When true, render the brackets in muted color so the inner label * reads as the main signal — useful in dense stat rows. */ outlined?: boolean | undefined; }): React.ReactElement; /** * A label : value row, sized for narrow rails. Reserves the first column * for an optional accent rail so a stat block reads as a single column of * cohesive data rather than a stack of loose Text nodes. The separator is * a flexible dot-leader so the value always lands at the right edge. */ export declare function SidebarStatRow({ label, value, color, accent, innerWidth, valueMuted, }: { label: string; value: string; color?: string | undefined; /** Optional accent rail. When set, a 1-col rail glyph is drawn at the * start of the row in this color so a block of rows reads as a "tag". */ accent?: string | undefined; innerWidth: number; valueMuted?: boolean | undefined; }): React.ReactElement; /** * A subtle horizontal divider with an optional centered diamond ornament. * Width-aware: on very narrow rails the diamond is dropped so the rule * never overflows the column. */ export declare function SidebarDivider({ innerWidth, ornament, color, }: { innerWidth: number; /** When set, draws `ornament` centered on the rule. */ ornament?: string | undefined; color?: string | undefined; }): React.ReactElement; /** * A section header: colored glyph + bold uppercase label, a dotted leader * filling the remaining width, and an optional right-aligned badge. Always * renders exactly one row of exactly `innerWidth` columns — the badge is * dropped gracefully when there is no room (narrow terminals). * * Modernized (v2): * * The glyph sits inside a 1-col "node" rail (▎) so it reads as a * visual anchor and never collides with the leading bold label. * * The badge is rendered through `SidebarStatusPill` (when `pill` is * true) so it picks up the capsuled ⟦ ⟧ treatment. * * The leader uses a real dotted leader (·) instead of a thin rule * (╌) which renders inconsistently across terminal emulators. */ export declare function SidebarSectionHeader({ glyph, label, color, badge, badgeColor, innerWidth, pill, badgeMuted, }: { glyph: string; label: string; color: string; badge?: string | undefined; badgeColor?: string | undefined; innerWidth: number; /** Render the badge as a capsuled pill instead of a bare token. */ pill?: boolean | undefined; /** When true, color the badge in muted text instead of accent. Useful * for "no data yet" empty-state badges. */ badgeMuted?: boolean | undefined; }): React.ReactElement; /** * A thin wrapper around the shared `Card` iskelet from * `./sidebar-card.tsx`. Preserved as a public export so existing test * fixtures and direct callers (e.g. `card-frame-integrity.test.tsx`) keep * working without changes. The new shared `Card` carries an extra `capped` * flag (defaulting to `true` for the legacy semantic of always drawing * the top + bottom cap); routed F-twin callers that want a hairline * divider instead of a corner frame should use the shared `Card` directly * with `capped={false}`. */ export declare function SidebarPanelCard(props: CardProps): React.ReactElement; /** * SidebarPanelFrame — the standard chrome wrapper used by every sidebar * panel variant. It composes a title row + optional status row + optional * kicker + body on top of the shared `Card` iskelet from * `./sidebar-card.tsx` (the same family the persistent MODEL CORE / * PROMPT CACHE / SYSTEM / AGENT SWARM / MISSIONS / SESSIONS cards use), * followed by an optional footer rendered below the card. The outer * RightSidebar still owns the border + padding + viewport clipping so * the routed frame's corners sit flush with the persistent cards down * the rail. * * v3: the chrome is delegated to the shared `Card` so the routed F twins * and the persistent cards read as one family at a glance. The previous * hand-rolled "borderless" title chrome is gone — the Card corners are * the only top/bottom rule. The `▎` rail at the title row's left edge is * preserved as the panel's accent signal (matching the persistent cards' * stage banner style), and the `│` sides from the Card body supply the * "framed" look on rails wide enough to afford them. */ export declare function SidebarPanelFrame({ accent, icon, title, width, kicker, right, pillLabel, pillColor, footer, children, }: SidebarPanelFrameProps): React.ReactElement; /** * useSidebarPanelSize — returns a sensible default width / height for a * sidebar panel given the terminal dimensions. Width mirrors * `computeSidebarWidth` from `sidebar.tsx`; height is the full terminal * minus a small safety margin for the focus indicator row. */ export declare function useSidebarPanelSize(): { width: number; height: number; }; //# sourceMappingURL=sidebar-panel-frame.d.ts.map