@juspay/neurolink
Version:
Universal AI Development Platform with working MCP integration, multi-provider support, voice (TTS/STT/realtime), and professional CLI. 58+ external MCP servers discoverable, multimodal file processing, RAG pipelines. Build, test, and deploy AI applicatio
348 lines (347 loc) • 10.7 kB
TypeScript
/**
* Slide Renderers
*
* Standalone render functions for each slide type.
* Extracted from SlideGenerator to keep functions under 300 lines.
*
* @module presentation/slideRenderers
*/
import type { BackgroundStyle, BulletPoint, ColumnData, PptxChartName, PptxSlide, PresentationTheme, RenderContentSlideOptions, SlideContent, SlideLayout, SlideType } from "../../types/index.js";
export declare const LAYOUT_POSITIONS: {
margin: {
x: number;
y: number;
};
title: {
x: number;
y: number;
w: number;
h: number;
};
subtitle: {
x: number;
y: number;
w: number;
h: number;
};
content: {
x: number;
y: number;
w: number;
h: number;
};
contentFull: {
x: number;
y: number;
w: number;
h: number;
};
contentLeft: {
x: number;
y: number;
w: number;
h: number;
};
contentRight: {
x: number;
y: number;
w: number;
h: number;
};
imageRight: {
x: number;
y: number;
w: number;
h: number;
};
imageLeft: {
x: number;
y: number;
w: number;
h: number;
};
imageFull: {
x: number;
y: number;
w: number;
h: number;
};
imageCentered: {
x: number;
y: number;
w: number;
h: number;
};
columnLeft: {
x: number;
y: number;
w: number;
h: number;
};
columnRight: {
x: number;
y: number;
w: number;
h: number;
};
col1: {
x: number;
y: number;
w: number;
h: number;
};
col2: {
x: number;
y: number;
w: number;
h: number;
};
col3: {
x: number;
y: number;
w: number;
h: number;
};
chart: {
x: number;
y: number;
w: number;
h: number;
};
statRow: {
y: number;
h: number;
};
footer: {
x: number;
y: number;
w: number;
h: number;
};
logo: {
"top-left": {
x: number;
y: number;
};
"top-right": {
x: number;
y: number;
};
"bottom-left": {
x: number;
y: number;
};
"bottom-right": {
x: number;
y: number;
};
};
quote: {
x: number;
y: number;
w: number;
h: number;
};
quoteAuthor: {
x: number;
y: number;
w: number;
h: number;
};
};
/**
* Add enhanced background with gradient or multi-color designs
* Creates visually appealing slides with sophisticated styling
*/
export declare function addEnhancedBackground(slide: PptxSlide, theme: PresentationTheme, style?: BackgroundStyle): void;
/**
* Add subtle colored background to slides (legacy - use addEnhancedBackground for more options)
*/
export declare function addColoredBackground(slide: PptxSlide, theme: PresentationTheme, opacity?: number): void;
/**
* Add modern card-style container with border
*/
export declare function addCardContainer(slide: PptxSlide, pos: {
x: number;
y: number;
w: number;
h: number;
}, theme: PresentationTheme, borderWidth?: number): void;
/**
* Add accent bar for visual hierarchy
*/
export declare function addAccentBar(slide: PptxSlide, pos: {
x: number;
y: number;
w: number;
h: number;
}, theme: PresentationTheme, position?: "left" | "top" | "bottom"): void;
/**
* Calculate text width in inches based on font size and character count.
* Uses typographic metrics for Arial font family.
*
* @param text - The text string to measure
* @param fontSize - Font size in points
* @param isBold - Whether the text is bold (adds ~10% width)
* @returns Width in inches
*/
export declare function calculateTextWidth(text: string, fontSize: number, isBold?: boolean): number;
export declare function addTitle(slide: PptxSlide, title: string, theme: PresentationTheme, showUnderline?: boolean): void;
/**
* Add individual bullet items (each as separate text element)
* This creates cleaner spacing and no bounding box around bullets
* Useful for column layouts and when you want more control over spacing
*/
export declare function addIndividualBullets(options: {
slide: PptxSlide;
bullets: BulletPoint[];
startX: number;
startY: number;
width: number;
theme: PresentationTheme;
itemSpacing?: number;
}): void;
/**
* Add bullets to a slide with hybrid formatting
*
* Priority: bullet-level > slide-level > type-defaults > theme-defaults
*
* @param slide - The pptxgenjs slide
* @param bullets - Array of bullet points (normalized)
* @param pos - Position and dimensions
* @param theme - Presentation theme
* @param slideType - Slide type for default formatting (optional)
*/
export declare function addBullets(slide: PptxSlide, bullets: BulletPoint[], pos: {
x: number;
y: number;
w: number;
h: number;
}, theme: PresentationTheme, slideType?: SlideType, options?: {
useIndividualBullets?: boolean;
itemSpacing?: number;
}): void;
export declare function addImage(slide: PptxSlide, imageBuffer: Buffer, pos: {
x: number;
y: number;
w: number;
h: number;
}): void;
export declare function getPptxChartType(slideType: SlideType): PptxChartName;
export declare function renderTitleSlide(slide: PptxSlide, title: string, content: SlideContent, theme: PresentationTheme, imageBuffer?: Buffer): void;
export declare function renderSectionHeaderSlide(slide: PptxSlide, title: string, content: SlideContent, theme: PresentationTheme): void;
export declare function renderThankYouSlide(slide: PptxSlide, title: string, content: SlideContent, theme: PresentationTheme, imageBuffer?: Buffer): void;
export declare function renderContentSlide(options: RenderContentSlideOptions): void;
export declare function renderImageSlide(slide: PptxSlide, title: string, content: SlideContent, layout: SlideLayout, theme: PresentationTheme, imageBuffer?: Buffer): void;
/**
* Generic column slide renderer
* Handles 2, 3, or more columns dynamically
* Renders each bullet as separate element (comparison-style)
*/
export declare function renderColumnSlide(slide: PptxSlide, title: string, columns: ColumnData[], theme: PresentationTheme, options?: {
headerY?: number;
headerHeight?: number;
bulletsStartY?: number;
columnGap?: number;
highlightFirstColumn?: boolean;
}): void;
export declare function renderTwoColumnSlide(slide: PptxSlide, title: string, content: SlideContent, layout: SlideLayout, theme: PresentationTheme, imageBuffer?: Buffer): void;
export declare function renderThreeColumnSlide(slide: PptxSlide, title: string, content: SlideContent, theme: PresentationTheme): void;
export declare function renderQuoteSlide(slide: PptxSlide, title: string, content: SlideContent, theme: PresentationTheme): void;
export declare function renderStatisticsSlide(slide: PptxSlide, title: string, content: SlideContent, theme: PresentationTheme): void;
export declare function renderChartSlide(slide: PptxSlide, title: string, content: SlideContent, chartType: SlideType, theme: PresentationTheme): void;
export declare function renderTableSlide(slide: PptxSlide, title: string, content: SlideContent, theme: PresentationTheme): void;
export declare function renderTimelineSlide(slide: PptxSlide, title: string, content: SlideContent, theme: PresentationTheme): void;
export declare function renderProcessFlowSlide(slide: PptxSlide, title: string, content: SlideContent, theme: PresentationTheme): void;
export declare function renderComparisonSlide(slide: PptxSlide, title: string, content: SlideContent, theme: PresentationTheme): void;
export declare function renderFeaturesSlide(slide: PptxSlide, title: string, content: SlideContent, theme: PresentationTheme): void;
export declare function renderTeamSlide(slide: PptxSlide, title: string, content: SlideContent, theme: PresentationTheme): void;
export declare function renderConclusionSlide(slide: PptxSlide, title: string, content: SlideContent, theme: PresentationTheme): void;
/**
* Predefined grid layouts for composite slides
*/
export declare const COMPOSITE_LAYOUTS: {
"left-right": {
x: number;
y: number;
w: number;
h: number;
}[];
"top-bottom": {
x: number;
y: number;
w: number;
h: number;
}[];
"three-cols": {
x: number;
y: number;
w: number;
h: number;
}[];
quadrants: {
x: number;
y: number;
w: number;
h: number;
}[];
"five-boxes": {
x: number;
y: number;
w: number;
h: number;
}[];
"six-boxes": {
x: number;
y: number;
w: number;
h: number;
}[];
"main-sidebar": {
x: number;
y: number;
w: number;
h: number;
}[];
"top-three": {
x: number;
y: number;
w: number;
h: number;
}[];
};
/**
* Render a composite/dashboard slide with multiple content zones
*
* @example
* // Left: bullets, Right: chart
* renderDashboardSlide(slide, "Overview", {
* layout: "left-right",
* zones: [
* { type: "bullets", title: "Key Points", data: bullets },
* { type: "chart", title: "Trend", data: chartData }
* ]
* }, theme);
*/
export declare function renderDashboardSlide(slide: PptxSlide, title: string, content: {
layout: keyof typeof COMPOSITE_LAYOUTS;
zones: Array<{
type: "bullets" | "chart" | "stats" | "icon-box" | "text-box";
title?: string;
data?: unknown;
isPrimary?: boolean;
}>;
}, theme: PresentationTheme): void;
/**
* Render a mixed content slide with left bullets and right chart
* Common pattern: explanation on left, visualization on right
*/
export declare function renderMixedContentSlide(slide: PptxSlide, title: string, content: SlideContent, theme: PresentationTheme): void;
/**
* Render a stats grid slide with multiple stat boxes
*/
export declare function renderStatsGridSlide(slide: PptxSlide, title: string, content: SlideContent, theme: PresentationTheme): void;
/**
* Render an icon grid slide with multiple icon boxes
*/
export declare function renderIconGridSlide(slide: PptxSlide, title: string, content: SlideContent, theme: PresentationTheme): void;