import type { CSSProperties, ReactNode } from 'react';
import type { BlockType, TileConfig } from '../types';
/**
 * Data passed to render props
 */
export interface RenderData {
    tile: TileConfig;
    isExpanded: boolean;
    surface: 'overlay' | 'wheel';
}
/**
 * Default renderer function signature
 */
export type DefaultRenderer<T = ReactNode> = (data: RenderData) => T;
/**
 * Render prop function signature - receives data and default renderer
 */
export type RenderProp<T = ReactNode> = (data: RenderData, defaultRenderer: DefaultRenderer<T>) => T;
/**
 * Complete render props configuration (Novu-style pyramid)
 */
export interface RenderProps {
    renderTile?: RenderProp;
    renderHeader?: RenderProp;
    renderIcon?: RenderProp;
    renderTitle?: RenderProp;
    renderSubtitle?: RenderProp;
    renderPreview?: RenderProp;
    renderContent?: RenderProp;
    renderActions?: RenderProp;
    renderByType?: Partial<Record<BlockType, RenderProp>>;
}
/**
 * Style overrides for tile parts
 */
export interface StyleOverrides {
    tile?: CSSProperties;
    header?: CSSProperties;
    icon?: CSSProperties;
    title?: CSSProperties;
    subtitle?: CSSProperties;
    preview?: CSSProperties;
    content?: CSSProperties;
    actions?: CSSProperties;
    action?: CSSProperties;
}
/**
 * Class name overrides for custom styling
 */
export interface ClassNameOverrides {
    tile?: string;
    header?: string;
    icon?: string;
    title?: string;
    subtitle?: string;
    preview?: string;
    content?: string;
    actions?: string;
    action?: string;
}
/**
 * Complete appearance configuration
 */
export interface AppearanceConfig {
    variables?: Partial<Record<`--sc-${string}`, string>>;
    styles?: StyleOverrides;
    classNames?: ClassNameOverrides;
    baseTheme?: 'light' | 'dark' | 'system';
}
/**
 * Action handler for interactive elements
 */
export interface ActionHandler {
    onActionClick?: (actionId: string, tile: TileConfig) => void;
    onTileClick?: (tile: TileConfig) => void;
    onTileDismiss?: (tile: TileConfig) => void;
    onRatingSubmit?: (value: number, tile: TileConfig) => void;
    onFormSubmit?: (data: Record<string, unknown>, tile: TileConfig) => void;
    onSurveySubmit?: (choices: string[], tile: TileConfig) => void;
}
