# @openmaic/renderer React component for rendering PPTist-style `Slide` JSON. Extracted from [OpenMAIC](https://github.com/THU-MAIC/OpenMAIC). > `@openmaic/renderer` is the read-only canvas package. Editing lives in the > separate `@openmaic/editor` package, which depends on this renderer. ## Migrating from 0.0.x Version `0.1.0` removes the experimental `@openmaic/renderer/editing` subpath. Install `@openmaic/editor` and migrate editing imports to its explicit layers: ```ts import { EditableSlideCanvas } from '@openmaic/editor/react'; import { EditableSlideCanvasWithUI } from '@openmaic/editor/ui'; ``` Read-only rendering imports from `@openmaic/renderer` are unchanged. ## Install ```bash pnpm add @openmaic/renderer # or npm install @openmaic/renderer ``` Required peers: - `react >= 18` - `react-dom >= 18` - `motion >= 11` - `tailwindcss >= 4` — **the package emits Tailwind 4 arbitrary-value classes, consumers must use Tailwind 4** Optional peers (install only if your slides use the corresponding element type): - `echarts >= 5` — for chart elements - `shiki >= 1` — for code elements ## Quickstart ```tsx import { SlideCanvas, type Slide } from '@openmaic/renderer'; const slide: Slide = { id: 'demo-1', viewportSize: 1000, viewportRatio: 0.5625, theme: { backgroundColor: '#ffffff', themeColors: ['#5b8def'], fontColor: '#222222', fontName: 'sans-serif', }, elements: [ { type: 'text', id: 't1', left: 100, top: 80, width: 800, height: 60, rotate: 0, content: '

Hello, Slide

', defaultFontName: 'sans-serif', defaultColor: '#222', }, ], background: { type: 'solid', color: '#ffffff' }, }; export default function Demo() { return (
); } ``` The canvas auto-fits its parent container. The parent must have a defined `width × height`. ## API ### `` The main read-only entry. Reads everything from props; zero global state. ```ts interface SlideCanvasProps { slide?: Slide; // required unless via scale?: number; // omit = auto-fit container canvasPercentage?: number; // percent of the parent used by auto-fit onScaleChange?: (scale) => void; // computed auto-fit scale background?: SlideBackground; // overrides slide.background effects?: SlideEffects; // laser / spotlight / highlight / zoom, all default off renderImage?: (el, src, defaultContent) => ReactNode; renderVideo?: (el) => ReactNode; videoInteractive?: boolean; // defaults true; set false to disable video pointer interaction onElementClick?: (el, event) => void; elementIdPrefix?: string; className?: string; style?: CSSProperties; } ``` ### Play-time effects All effects are off by default. Pass any combination via `effects`: ```tsx ``` ### Media injection slots The package's `BaseImageElement` and `BaseVideoElement` render plain `` / `