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