/**
 * NiceToDev Presentation Document Format (.ndp.json)
 *
 * Custom format supporting animated slides with data binding,
 * chart embedding, diagram embedding, and rich transitions.
 */
export interface NicePresentationDocument {
    /** Format version — currently "1.0" */
    version: '1.0';
    /** Unique document identifier */
    id: string;
    /** Presentation title */
    title: string;
    /** Author name */
    author?: string;
    /** Slide dimensions */
    slideSize: SlideSize;
    /** All slides in order */
    slides: PresentationSlide[];
    /** Global theme */
    theme: PresentationTheme;
    /** Speaker notes display settings */
    speakerSettings?: SpeakerSettings;
    /** Document metadata */
    metadata: PresentationMetadata;
}
export interface PresentationSlide {
    id: string;
    /** Slide title (shown in outline / thumbnail) */
    title: string;
    /** Layout preset */
    layout: SlideLayout;
    /** Background */
    background: SlideBackground;
    /** All elements on the slide */
    elements: SlideElement[];
    /** Transition to this slide */
    transition?: SlideTransition;
    /** Speaker notes (markdown) */
    notes?: string;
    /** Duration hint in ms (for auto-advance) */
    durationMs?: number;
    /** Whether this is a section divider */
    isSectionDivider?: boolean;
}
export type SlideLayout = 'blank' | 'titleSlide' | 'titleContent' | 'twoColumn' | 'titleOnly' | 'sectionHeader' | 'comparison' | 'custom';
export interface SlideBackground {
    type: 'solid' | 'gradient' | 'image';
    color?: string;
    gradientStops?: Array<{
        color: string;
        position: number;
    }>;
    gradientDirection?: number;
    imageUrl?: string;
    imageFit?: 'cover' | 'contain' | 'stretch';
    opacity?: number;
}
export interface SlideElement {
    id: string;
    type: SlideElementType;
    /** Position and size (percentage of slide or absolute px) */
    position: ElementPosition;
    /** Element-specific content */
    content: ElementContent;
    /** Entrance animation */
    animation?: ElementAnimation;
    /** Z-index (draw order) */
    zIndex?: number;
    /** Rotation in degrees */
    rotation?: number;
    /** Opacity 0–1 */
    opacity?: number;
    /** Lock editing */
    locked?: boolean;
}
export type SlideElementType = 'text' | 'image' | 'shape' | 'chart' | 'table' | 'code' | 'diagram' | 'video' | 'icon' | 'button' | 'poll' | 'quiz' | 'countdown' | 'qna';
export interface ElementPosition {
    x: number;
    y: number;
    width: number;
    height: number;
    unit?: 'percent' | 'px';
}
export type ElementContent = TextContent | ImageContent | ShapeContent | ChartContent | TableContent | CodeContent | DiagramContent | VideoContent | IconContent | ButtonContent | PollContent | QuizContent | CountdownContent | QnAContent;
export interface TextContent {
    kind?: 'text';
    type?: 'text';
    /** Markdown-like text (supports **bold**, *italic*, headers) */
    text: string;
    fontSize?: number;
    fontFamily?: string;
    fontColor?: string;
    color?: string;
    fontWeight?: 'normal' | 'bold' | number;
    textAlign?: 'left' | 'center' | 'right';
    lineHeight?: number;
    /** Bullet list rendering */
    listStyle?: 'none' | 'bullet' | 'numbered';
    /** Style object shorthand */
    style?: {
        fontSize?: number;
        fontFamily?: string;
        fontWeight?: 'normal' | 'bold' | number;
        color?: string;
        textAlign?: string;
        lineHeight?: number;
        [key: string]: unknown;
    };
}
export interface ImageContent {
    kind?: 'image';
    type?: 'image';
    src: string;
    alt?: string;
    objectFit?: 'cover' | 'contain' | 'fill';
    borderRadius?: number;
    shadow?: boolean;
}
export interface ShapeContent {
    kind?: 'shape';
    type?: 'shape';
    shapeType?: 'rectangle' | 'ellipse' | 'triangle' | 'arrow' | 'line' | 'star' | 'roundedRect';
    shape?: string;
    fill?: string;
    stroke?: string;
    strokeWidth?: number;
    cornerRadius?: number;
    text?: string;
}
export interface ChartContent {
    kind?: 'chart';
    type?: 'chart';
    chartType: 'bar' | 'line' | 'pie' | 'doughnut' | 'radar' | 'scatter';
    /** Chart title */
    title?: string;
    /** Inline data */
    data: ChartDataSet;
    /** Or data binding URL  */
    dataSourceUrl?: string;
    /** Chart appearance */
    options?: ChartOptions;
}
export interface ChartDataSet {
    labels: string[];
    series?: Array<{
        name: string;
        values: number[];
        color?: string;
    }>;
    datasets?: Array<{
        label?: string;
        data: number[];
        color?: string;
        backgroundColor?: string | string[];
        [key: string]: unknown;
    }>;
}
export interface ChartOptions {
    showLegend?: boolean;
    showLabels?: boolean;
    showDataLabels?: boolean;
    showGrid?: boolean;
    showGridLines?: boolean;
    animated?: boolean;
    animation?: boolean;
    colors?: string[];
}
export interface TableContent {
    kind?: 'table';
    type?: 'table';
    headers: string[];
    rows: string[][];
    /** Data source URL for dynamic tables */
    dataSourceUrl?: string;
    /** Styling */
    headerBg?: string;
    headerColor?: string;
    stripedRows?: boolean;
    borderColor?: string;
    /** Style object shorthand */
    style?: {
        headerBackground?: string;
        headerColor?: string;
        cellPadding?: number;
        fontSize?: number;
        borderColor?: string;
        [key: string]: unknown;
    };
}
export interface CodeContent {
    kind?: 'code';
    type?: 'code';
    code: string;
    language: string;
    /** Highlight specific lines */
    highlightLines?: number[];
    fontSize?: number;
    theme?: 'dark' | 'light';
}
export interface DiagramContent {
    kind?: 'diagram';
    type?: 'diagram';
    /** Inline .ndd.json document ID or embedded document */
    diagramDocumentId?: string;
    /** Or inline diagram JSON (NiceDiagramDocument serialized) */
    inlineDiagramJson?: string;
    /** Auto-play animations */
    autoPlayAnimations?: boolean;
}
export interface VideoContent {
    kind?: 'video';
    type?: 'video';
    src: string;
    autoPlay?: boolean;
    loop?: boolean;
    muted?: boolean;
    poster?: string;
}
export interface IconContent {
    kind?: 'icon';
    type?: 'icon';
    /** Icon name from @nice2dev/icons or URL */
    name: string;
    size?: number;
    color?: string;
}
export interface ButtonContent {
    kind?: 'button';
    type?: 'button';
    /** Button label */
    label: string;
    /** Action to perform */
    action: ButtonAction;
    /** Button style */
    variant?: 'primary' | 'secondary' | 'outline' | 'ghost';
    /** Button size */
    size?: 'small' | 'medium' | 'large';
    /** Icon name (optional) */
    icon?: string;
    /** Icon position */
    iconPosition?: 'left' | 'right';
    /** Background color override */
    backgroundColor?: string;
    /** Text color override */
    textColor?: string;
    /** Border radius */
    borderRadius?: number;
}
export type ButtonAction = {
    type: 'nextSlide';
} | {
    type: 'previousSlide';
} | {
    type: 'goToSlide';
    slideId: string;
} | {
    type: 'openUrl';
    url: string;
    newTab?: boolean;
} | {
    type: 'playMedia';
    mediaId: string;
} | {
    type: 'pauseMedia';
    mediaId: string;
} | {
    type: 'triggerAnimation';
    elementId: string;
} | {
    type: 'showElement';
    elementId: string;
} | {
    type: 'hideElement';
    elementId: string;
} | {
    type: 'custom';
    handler: string;
};
export interface PollContent {
    kind?: 'poll';
    type?: 'poll';
    /** Poll question */
    question: string;
    /** Poll options */
    options: PollOption[];
    /** Allow multiple selections */
    multiSelect?: boolean;
    /** Show results after voting */
    showResultsAfterVote?: boolean;
    /** Show results in real-time */
    liveResults?: boolean;
    /** Poll display style */
    displayStyle?: 'buttons' | 'radio' | 'horizontal-bar';
    /** Color scheme for results */
    resultColors?: string[];
    /** Anonymous voting */
    anonymous?: boolean;
    /** Current results (runtime state) */
    results?: Record<string, number>;
}
export interface PollOption {
    id: string;
    text: string;
    color?: string;
    icon?: string;
}
export interface QuizContent {
    kind?: 'quiz';
    type?: 'quiz';
    /** Quiz question */
    question: string;
    /** Answer options */
    answers: QuizAnswer[];
    /** Quiz type */
    quizType?: 'single' | 'multiple' | 'true-false';
    /** Show correct answer after submission */
    showCorrectAfterSubmit?: boolean;
    /** Time limit in seconds (0 = no limit) */
    timeLimitSeconds?: number;
    /** Points for correct answer */
    points?: number;
    /** Feedback message for correct answer */
    correctFeedback?: string;
    /** Feedback message for incorrect answer */
    incorrectFeedback?: string;
    /** Explanation shown after answering */
    explanation?: string;
    /** Current user answer (runtime state) */
    userAnswer?: string[];
    /** Whether submitted (runtime state) */
    submitted?: boolean;
}
export interface QuizAnswer {
    id: string;
    text: string;
    /** Is this the correct answer? */
    isCorrect: boolean;
    /** Optional feedback for this specific answer */
    feedback?: string;
}
export interface CountdownContent {
    kind?: 'countdown';
    type?: 'countdown';
    /** Target time (ISO 8601) or duration in seconds */
    target: string | number;
    /** Display format */
    format?: 'hh:mm:ss' | 'mm:ss' | 'ss' | 'full';
    /** Style preset */
    style?: 'digital' | 'circular' | 'flip' | 'minimal';
    /** Show labels (hours, minutes, seconds) */
    showLabels?: boolean;
    /** Action when timer reaches zero */
    onComplete?: ButtonAction;
    /** Colors */
    textColor?: string;
    backgroundColor?: string;
    /** Warning threshold (seconds) - changes color */
    warningThreshold?: number;
    warningColor?: string;
}
export interface QnAContent {
    kind?: 'qna';
    type?: 'qna';
    /** Placeholder text for input */
    placeholder?: string;
    /** Allow anonymous questions */
    allowAnonymous?: boolean;
    /** Moderate questions before showing */
    moderated?: boolean;
    /** Allow upvoting questions */
    allowUpvote?: boolean;
    /** Maximum questions to display */
    maxVisible?: number;
    /** Display style */
    displayStyle?: 'list' | 'stack' | 'floating';
    /** Character limit for questions */
    charLimit?: number;
    /** Submitted questions (runtime state) */
    questions?: QnAQuestion[];
}
export interface QnAQuestion {
    id: string;
    text: string;
    author?: string;
    timestamp: string;
    upvotes: number;
    answered?: boolean;
}
export interface ElementAnimation {
    /** Entrance effect */
    entrance?: AnimationConfig;
    /** Emphasis effect (looping) */
    emphasis?: AnimationConfig;
    /** Exit effect */
    exit?: AnimationConfig;
    /** Build order (elements with lower order animate first) */
    buildOrder?: number;
    /** Trigger: on slide enter or on click */
    trigger?: 'onSlideEnter' | 'onClick' | 'afterPrevious' | 'withPrevious';
    /** Flat shorthand: effect name */
    effect?: SlideAnimationEffect;
    /** Flat shorthand: duration */
    durationMs?: number;
    /** Flat shorthand: delay */
    delayMs?: number;
    /** Flat shorthand: easing */
    easing?: SlideEasing;
}
export interface AnimationConfig {
    effect: SlideAnimationEffect;
    durationMs: number;
    easing?: SlideEasing;
    delayMs?: number;
}
export type SlideAnimationEffect = 'fadeIn' | 'fadeOut' | 'slideInLeft' | 'slideInRight' | 'slideInTop' | 'slideInBottom' | 'slideInUp' | 'slideInDown' | 'zoomIn' | 'zoomOut' | 'bounceIn' | 'flipInX' | 'flipInY' | 'rotateIn' | 'typewriter' | 'wipeLeft' | 'wipeRight' | 'splitReveal' | 'pulse' | 'shake' | 'glow';
export type SlideEasing = 'linear' | 'easeIn' | 'easeOut' | 'easeInOut' | 'spring' | 'bounce';
export interface SlideTransition {
    effect: TransitionEffect;
    durationMs: number;
    direction?: 'left' | 'right' | 'up' | 'down';
}
export type TransitionEffect = 'none' | 'fade' | 'slide' | 'zoom' | 'flip' | 'cube' | 'wipe' | 'dissolve' | 'push' | 'cover';
export interface PresentationTheme {
    name?: string;
    backgroundColor?: string;
    primaryColor?: string;
    secondaryColor?: string;
    accentColor?: string;
    textColor?: string;
    headingColor?: string;
    fontFamily?: string;
    headingFontFamily?: string;
    codeFontFamily?: string;
    /** Convenience aliases for heading/body fonts (used by collaborative editor). */
    fontHeading?: string;
    fontBody?: string;
    colors?: string[] | Record<string, string>;
    fonts?: Record<string, string>;
    spacing?: {
        base?: number;
        [key: string]: unknown;
    };
}
export interface SlideSize {
    width: number;
    height: number;
    unit?: 'px' | 'percent';
}
/** Standard 16:9 */
export declare const SLIDE_16_9: SlideSize;
/** Standard 4:3 */
export declare const SLIDE_4_3: SlideSize;
/** Widescreen */
export declare const SLIDE_WIDESCREEN: SlideSize;
export interface SpeakerSettings {
    showTimer?: boolean;
    showNextSlide?: boolean;
    showNotes?: boolean;
    fontSize?: number;
}
export interface PresentationMetadata {
    createdAt: string;
    updatedAt: string;
    description?: string;
    tags?: string[];
    /** Total estimated duration in ms */
    estimatedDurationMs?: number;
    /** Template identifier */
    templateId?: string;
    /** Template version */
    templateVersion?: string;
}
export declare const THEME_CORPORATE: PresentationTheme;
export declare const THEME_MODERN_DARK: PresentationTheme;
export declare const THEME_MINIMAL: PresentationTheme;
export declare const THEME_NICE2DEV: PresentationTheme;
//# sourceMappingURL=presentationTypes.d.ts.map