import { type ReactNode } from "react";
import { type StyleProp, type ViewStyle, type TextStyle } from "../../style/index.js";
export type Tone = "info" | "success" | "warning" | "error" | "neutral";
export interface AlertSkin {
/** Banner shape + density (border-radius, padding, gap). */
container: ViewStyle;
/** Leading glyph type (size / line-height). */
iconType: TextStyle;
/** Title type (size / line-height / weight / tracking). */
titleType: TextStyle;
/** Description / body type (size / line-height / tracking). */
bodyType: TextStyle;
/** Dismiss control shape (size, radius). */
dismissButton: ViewStyle;
/** Dismiss glyph type (size / line-height). */
dismissType: TextStyle;
/** Pressed opacity for the dismiss control (iOS/web dim; Android stays opaque under ripple). */
dismissPressedOpacity: number;
/**
* Hit-area inset per side (pt/dp) padding the 24px dismiss box out to the platform
* minimum touch target (HIG 44x44pt on iOS, M3 48x48dp on Android) without changing
* the rendered size. null (web) keeps pointer targets visual.
*/
dismissHitSlop: number | null;
/** Footer action region: the row layout + gap between action buttons, plus the
* top separation dividing them from the body above. */
actions: ViewStyle;
}
export interface AlertProps {
title?: string;
description?: string;
icon?: ReactNode;
info?: boolean;
success?: boolean;
warning?: boolean;
/** The danger tone. This is the name the intent axis uses across the kit (Button,
* AlertDialog, and every chart) and the one the design hand-off uses here too. */
destructive?: boolean;
/** @deprecated Use `destructive`. Kept working so existing call sites are untouched;
* it resolves to exactly the same tone. */
error?: boolean;
/** Shows a trailing dismiss control. Pressing it hides the banner out of the box
* (uncontrolled); pass `dismissed` to own that state instead. */
dismissible?: boolean;
/** Cap the banner at 320px, the measure of a standard (base-width) form field. */
narrow?: boolean;
/** Cap the banner at 640px, for roomy content regions. */
wide?: boolean;
/** Fill the container with no cap: the full-width announcement bar. */
block?: boolean;
/** Controlled dismissal: `true` hides the banner. Omit to let the Alert manage it. */
dismissed?: boolean;
/** Uncontrolled seed: start hidden. Rarely useful; defaults to false. */
defaultDismissed?: boolean;
/** Fired when the dismiss control is pressed (both modes). */
onDismiss?: () => void;
children?: ReactNode;
/** E2E hook forwarded to the root element. */
testID?: string;
/**
* A footer action region rendered under the body. The Alert owns the layout: it
* separates the actions from the description above and lays the buttons out in a
* row, so a call site passes the buttons directly
* (`actions={}`) with no wrapper.
* Pass a fragment for more than one action.
*/
actions?: ReactNode;
/** Outer layout composition only (width/flex within a parent), never a restyle hook. */
style?: StyleProp;
}
export declare function createAlert(skin: AlertSkin): (props: AlertProps) => import("react").JSX.Element | null;
//# sourceMappingURL=alert.shared.d.ts.map