import { Tokens } from 'marked'; /** * Supported slide layouts */ export type SlideLayout = 'default' | 'cover' | 'center' | 'two-cols' | 'image-right' | 'image-left' | 'full' | 'statement' | 'fact' | 'quote' | 'section'; /** * Supported slide transitions */ export type SlideTransition = 'slide' | 'fade' | 'slide-up' | 'slide-down' | 'zoom' | 'none'; /** * Configuration options for the slide extension */ export interface SlideOptions { /** CSS class name for the presentation container */ className?: string; /** Prefix for generating unique slide IDs */ prefixId?: string; /** Default transition effect */ transition?: SlideTransition; /** Transition duration */ transitionDuration?: string; /** Default slide layout */ defaultLayout?: SlideLayout; /** Whether to show slide numbers */ showSlideNumbers?: boolean; /** Whether to show navigation controls */ showControls?: boolean; /** Whether to show progress bar */ showProgress?: boolean; /** Enable keyboard navigation */ keyboardNavigation?: boolean; /** Enable touch/swipe navigation */ touchNavigation?: boolean; /** Enable overview mode (grid view) */ overviewMode?: boolean; /** Aspect ratio (width:height) */ aspectRatio?: string; /** Theme name */ theme?: string; /** Custom template for rendering slides */ template?: string | null; /** Custom template for rendering the presentation container */ containerTemplate?: string | null; /** Function to customize the slide token */ customizeToken?: ((token: SlideToken) => void) | null; /** Function to customize the presentation token */ customizePresentation?: ((token: PresentationToken) => void) | null; /** Whether to inject interactive JavaScript */ injectScript?: boolean; /** Whether to auto-advance slides */ autoplay?: boolean; /** Auto-advance interval in ms */ autoplayInterval?: number; /** Enable speaker view mode */ speakerMode?: boolean; /** CSP nonce for injected script tag */ scriptNonce?: string; } /** * Metadata for individual slide */ export interface SlideMeta { /** Slide layout type */ layout: SlideLayout; /** Background color or gradient */ background?: string; /** Background image URL */ backgroundImage?: string; /** Background size (cover, contain, etc.) */ backgroundSize?: string; /** Background position */ backgroundPosition?: string; /** Transition effect */ transition?: SlideTransition; /** Custom CSS class for this slide */ class?: string; /** Slide notes (for speaker view) */ notes?: string; /** Whether to hide slide number on this slide */ hideSlideNumber?: boolean; } /** * Token for individual slide */ export interface SlideToken extends Tokens.Generic { type: 'slide'; raw: string; /** Child tokens produced from the slide content */ tokens: Tokens.Generic[]; meta: SlideMeta; } /** * Metadata for the entire presentation */ export interface PresentationMeta { /** Presentation title */ title?: string; /** Presentation author */ author?: string; /** Presentation date */ date?: string; /** Presentation theme */ theme: string; /** Default transition */ transition: SlideTransition; /** Transition duration */ transitionDuration: string; /** Whether to show controls */ showControls: boolean; /** Whether to show progress */ showProgress: boolean; /** Whether to show slide numbers */ showSlideNumbers: boolean; /** Enable keyboard navigation */ keyboardNavigation: boolean; /** Enable touch/swipe navigation */ touchNavigation: boolean; /** Enable overview mode (grid view) */ overviewMode: boolean; /** Aspect ratio */ aspectRatio: string; /** CSS class name */ className: string; /** Prefix for slide IDs */ prefixId: string; /** Container template */ containerTemplate: string | null; /** Auto-advance slides */ autoplay: boolean; /** Auto-advance interval in ms */ autoplayInterval: number; /** Enable speaker view mode */ speakerMode: boolean; } /** * Token for the entire presentation */ export interface PresentationToken extends Tokens.Generic { type: 'presentation'; raw: string; /** Child slide tokens; kept in the standard `tokens` field so Marked can walk descendants */ tokens: SlideToken[]; slides: SlideToken[]; meta: PresentationMeta; } /** * Renderer context type from marked */ export interface RendererThis { parser: { parse: (tokens: Tokens.Generic[]) => string; parseInline: (tokens: Tokens.Generic[]) => string; }; } /** * Renderer options for individual slide */ export interface SlideRendererOptions { /** Slide number (1-indexed) */ slideNumber: number; /** Total number of slides */ totalSlides: number; /** Slide metadata */ meta: SlideMeta; /** Tokens to render as content */ tokens: Tokens.Generic[]; /** Parser instance from renderer context */ parser: RendererThis['parser']; /** Presentation metadata */ presentationMeta: PresentationMeta; /** Custom template */ template?: string | null; } /** * Renderer options for the presentation */ export interface PresentationRendererOptions { /** All slides */ slides: SlideToken[]; /** Presentation metadata */ meta: PresentationMeta; /** Parser instance from renderer context */ parser: RendererThis['parser']; }