import { ReactNode, RefObject } from "react"; //#region src/kanban/card-shell.d.ts export type KanbanCardShellProps = { children: ReactNode; /** Proposed work stays visually distinct until a person accepts it. */ appearance?: "standard" | "proposal" | undefined; /** Overlay slot pinned to the top-end corner (row actions). */ actions?: ReactNode; /** * Whether `actions` are drawn at all times or only once the card is under * the pointer. `"hover"` also hands their placement to the shell, so the * quiet actions of every board rest in the same corner and a caller passes * bare icon buttons; `"always"` (the default) leaves a caller's own overlay * exactly where it put it. * * While they are hidden they are also inert: they take no pointer events at * all, so a touch anywhere over the card — including the corner they will * appear in — reaches the card itself. A hidden overlay that still answered * a press would sit as a small dead zone on every card, and a long press * landing in it would never start the card's drag. * * Each pointer has its own way in. A pointer that hovers reveals them by * hovering the card; the keyboard reveals them by tabbing into them, which * being inert to a pointer never blocked. A finger has neither, so `active` * is its route: the card a tap opened shows its actions for as long as it * stays open. A board that never marks a card active leaves touch without * one, and should keep `"always"`. */ actionsVisibility?: "always" | "hover" | undefined; /** * The card's identity row: whatever says which card this is, held at the top * of the card while the card scrolls past under it, and released where the * card ends. A card taller than the viewport otherwise loses its own name * halfway down. Omit it and the card renders exactly as it did before. * * The row runs the card's full width and the actions overlay leads the same * corner over it, so leave the row's end side clear of anything the actions * would cover. * * Booleans are excluded so `condition && ` cannot reach the slot: a * `false` React renders as nothing would still leave the row's divider and * spacing behind. Write the absent case as `condition ? : null`. */ stickyHeader?: Exclude; /** Marks the card whose detail is currently open. */ active?: boolean | undefined; /** * Opens the card. Omit for a card with nothing to open: the shell then * renders a plain region instead of a button, so a card that does nothing * never lands in the tab order. */ onOpen?: (() => void) | undefined; /** The card body, for callers that measure or flash it. */ bodyRef?: RefObject | undefined; /** The drag source the shell wraps the card in. */ dragRef?: RefObject | undefined; className?: string | undefined; }; /** * The card chrome: border, hover lift, active ring, drag wrapper, and the * keyboard contract for a card that opens something. * * The shell carries no idea of what a card holds. Every board rendered one of * three near-identical copies of this markup, differing only in whether the * card opened anything, which is why opening is a prop rather than a branch at * each call site. * * Nothing here clips its overflow: a pinned identity row stops sticking the * moment anything between it and the scroll container clips. */ export declare const KanbanCardShell: ({ children, appearance, actions, actionsVisibility, stickyHeader, active, onOpen, bodyRef, dragRef, className }: KanbanCardShellProps) => import("react").JSX.Element; //#endregion