Referencia de la API del SDK
El namespace sdk.slides es el punto de entrada para todas las operaciones de presentación. Una instancia Presentation abierta expone sub-namespaces para slides, metadata, notas, controles del presentador, versiones, publicación, presencia y deshacer.
El campo visibility acepta private, workspace y public. (unlisted es un alias legacy retirado, aún aceptado en la API y tratado como public.)
sdk.slides — nivel superior
Sección titulada «sdk.slides — nivel superior»sdk.slides.create()
Sección titulada «sdk.slides.create()»Crear una presentación. Devuelve las URLs del artifact de edición y del publicado.
create(options: CreateOptions): Promise<CreateResult>
interface CreateOptions { title: string; description?: string; template?: string; // nombre del tema incluido aspectRatio?: '16:9' | '4:3' | '16:10'; visibility?: 'private' | 'workspace' | 'public'; theme?: string; // alias de template slides?: SlideSpec[]; // crear con contenido fromMarkdown?: string; // outline Markdown → slides}
interface CreateResult { id: string; editorUrl: string; // shareout.site/a/{slug} publishedUrl: string; // shareout.site/p/{slug} editorArtifactId: string; publishedArtifactId: string;}sdk.slides.open()
Sección titulada «sdk.slides.open()»Abrir una presentación para edición. Requiere autenticación con rol editor o owner.
open(id: string): Promise<Presentation>sdk.slides.view()
Sección titulada «sdk.slides.view()»Abrir una presentación para visualización. No requiere autenticación para presentaciones public.
view(id: string): Promise<Presentation>sdk.slides.list()
Sección titulada «sdk.slides.list()»Listar todas las presentaciones asociadas a este artifact.
list(): Promise<PresentationInfo[]>
interface PresentationInfo { id: string; title: string; slideCount: number; editorUrl: string; publishedUrl: string; visibility: 'private' | 'workspace' | 'public'; createdAt: string; updatedAt: string;}sdk.slides.delete()
Sección titulada «sdk.slides.delete()»delete(id: string): Promise<boolean>sdk.slides.generate()
Sección titulada «sdk.slides.generate()»Generar un deck completo desde un prompt usando IA del servidor. Devuelve la misma forma que create().
generate(options: { prompt: string; theme?: string; length?: number; // cantidad objetivo de slides title?: string; visibility?: 'private' | 'workspace' | 'public';}): Promise<CreateResult>Devuelve 503 cuando no hay proveedor de IA configurado; 502 en output inválido del modelo.
sdk.slides.helpers
Sección titulada «sdk.slides.helpers»Utilidades de generación de HTML. Ver Creación de decks para su uso.
helpers.textBlock(content: string, style?: TextStyle): stringhelpers.image(blobId: string, options?: ImageOptions): stringhelpers.codeBlock(code: string, language: string): stringhelpers.chart(config: ChartConfig): stringhelpers.embed(url: string, options?: EmbedOptions): stringhelpers.video(blobId: string, options?: VideoOptions): stringhelpers.fromMarkdown(md: string): SlideSpec[]
// Layouts completos de slidehelpers.layout.title(slots): stringhelpers.layout.section(slots): stringhelpers.layout.titleContent(slots): stringhelpers.layout.twoCol(slots): stringhelpers.layout.imageText(slots): stringhelpers.layout.fullImage(slots): stringhelpers.layout.bigStat(slots): stringhelpers.layout.quote(slots): stringhelpers.layout.cards(slots): stringhelpers.layout.chart(slots): stringhelpers.layout.blank(html: string): stringPresentation — conexión
Sección titulada «Presentation — conexión»connect(): Promise<void> // conectar al documento realtimedisconnect(): void // desconectar (el documento se mantiene)destroy(): void // desconectar y liberar recursostransact(fn: () => void): void // agrupar cambios en un paso de deshacerpresentation.meta
Sección titulada «presentation.meta»Metadata de la presentación. Las propiedades configuradas acá se heredan en todos los slides salvo que un slide especifique un override.
meta.get(): PresentationMetameta.set(changes: Partial<PresentationMeta>): voidmeta.observe(handler: (meta: PresentationMeta) => void): () => void
interface PresentationMeta { title: string; description: string; dimensions: { width: number; height: number }; aspectRatio: '16:9' | '4:3' | '16:10'; template: string | null; defaultFont: { heading: string; body: string; mono: string }; defaultColors: { background: string; text: string; accent: string }; defaultTransition: TransitionConfig; createdBy: string; updatedAt: string;}presentation.slides
Sección titulada «presentation.slides»CRUD de slides. El contenido se almacena separado de la metadata.
slides.list(): Slide[]slides.add(options?: AddSlideOptions): Slideslides.delete(slideId: string): booleanslides.move(fromIndex: number, toIndex: number): voidslides.duplicate(slideId: string): Slideslides.observe(handler: (slides: Slide[]) => void): () => void
interface Slide { id: string; owner: string | null; overrides: SlideOverrides | null; hidden: boolean; locked: boolean;}
interface SlideOverrides { background?: string; font?: { heading?: string; body?: string; mono?: string }; transition?: TransitionConfig;}
interface AddSlideOptions { afterSlideId?: string; content?: string;}Contenido
Sección titulada «Contenido»// Obtener Y.Text para binding colaborativo (p. ej. contenteditable, CodeMirror)slides.getContent(slideId: string): Y.Text
// Establecer contenido directamenteslides.setContent(slideId: string, html: string): void
// Actualizar metadata (overrides, hidden, locked)slides.update(slideId: string, changes: Partial<Slide>): voidOperaciones masivas
Sección titulada «Operaciones masivas»slides.addMany(slides: SlideSpec[]): Promise<Slide[]>slides.replaceAll(slides: SlideSpec[]): Promise<Slide[]>Ambas llaman a POST /data/slides/{id}/slides/batch — escritura atómica en el servidor.
Propiedad y bloqueo
Sección titulada «Propiedad y bloqueo»slides.setOwner(slideId: string, userId: string | null): voidslides.getOwner(slideId: string): string | nullslides.lock(slideId: string): voidslides.unlock(slideId: string): voidslides.isLocked(slideId: string): booleanIA por slide
Sección titulada «IA por slide»slides.rewrite(slideId: string, instruction: string): Promise<void>slides.expand(slideId: string, instruction: string): Promise<void>slides.generateNotes(slideId: string): Promise<string>slides.suggestLayout(slideId: string): Promise<string>presentation.speakerNotes
Sección titulada «presentation.speakerNotes»Notas Markdown por slide almacenadas como Y.Text.
speakerNotes.get(slideId: string): Y.Text // Y.Text para binding colaborativospeakerNotes.set(slideId: string, content: string): voidpresentation.presenter
Sección titulada «presentation.presenter»Ver Modo presentador para uso completo.
presenter.start(options?: StartOptions): Promise<void>presenter.stop(): voidpresenter.state(): PresentationStatepresenter.isActive(): booleanpresenter.isPresenter(): booleanpresenter.subscribe(handler: (state: PresentationState) => void): () => void
// Navegaciónpresenter.next(): voidpresenter.previous(): voidpresenter.goToSlide(index: number): voidpresenter.first(): voidpresenter.last(): void
// Blackoutpresenter.blackout(enabled: boolean): void
interface StartOptions { fromSlide?: number; countdown?: number; // segundos autoAdvance?: boolean; autoAdvanceInterval?: number;}
interface PresentationState { isPresenting: boolean; presenterId: string | null; presenterName: string | null; currentSlideIndex: number; totalSlides: number; startedAt: number | null; slideStartedAt: number | null; countdown: { total: number; remaining: number; paused: boolean } | null; laser: { enabled: boolean; position: { x: number; y: number } | null }; blackout: boolean;}presenter.timer
Sección titulada «presenter.timer»timer.elapsed(): number // segundos desde que empezó la presentacióntimer.slideElapsed(): number // segundos en el slide actualtimer.setCountdown(seconds: number): voidtimer.remaining(): number | null // null si no se configuró cuenta regresivatimer.pause(): voidtimer.resume(): voidtimer.reset(): voidpresenter.laser
Sección titulada «presenter.laser»laser.enable(): voidlaser.disable(): voidlaser.move(x: number, y: number): void // coordenadas normalizadas 0–1laser.isEnabled(): booleanpresentation.versions
Sección titulada «presentation.versions»versions.list(): Promise<Version[]>versions.create(name: string, description?: string): Promise<Version>versions.restore(versionId: string): Promise<void>versions.diff(fromId: string, toId: string): Promise<VersionDiff>versions.delete(versionId: string): Promise<boolean>versions.subscribe(handler: (versions: Version[]) => void): () => void
interface Version { id: string; presentationId: string; name: string; description: string | null; slideCount: number; createdAt: string; createdBy: { id: string; name: string; email: string }; isAutoSave: boolean; thumbnail: string | null;}
interface VersionDiff { slides: { added: string[]; removed: string[]; modified: string[]; reordered: boolean }; metadata: { changed: string[] };}presentation.publish
Sección titulada «presentation.publish»publish.getUrl(): string // shareout.site/p/{slug}publish.setVisibility(v: 'private' | 'workspace' | 'public'): voidpublish.unpublish(): voidpublish.republish(): voidpresentation.presence
Sección titulada «presentation.presence»Estado efímero del usuario — no se almacena en el documento Y.js.
presence.set(state: Partial<SlidesPresenceState>): voidpresence.get(): Map<string, SlidesPresenceState>presence.subscribe(handler: (users: Map<string, SlidesPresenceState>) => void): () => voidpresence.getEditorsOnSlide(slideId: string): SlidesPresenceState[]
interface SlidesPresenceState { user: { id: string; name: string; color: string }; viewingSlideId: string | null; editingSlideId: string | null; cursor: { x: number; y: number } | null; textSelection: { start: number; end: number } | null; laserPointer: { x: number; y: number } | null; mode: 'edit' | 'view' | 'present' | 'speaker';}presentation.undo
Sección titulada «presentation.undo»Stack de deshacer por usuario, limitado a los cambios del cliente actual.
undo.manager(): Y.UndoManagerundo.canUndo(): booleanundo.canRedo(): booleanundo.undo(): voidundo.redo(): voidEventos
Sección titulada «Eventos»presentation.on(event: SlidesEvent, handler: Function): voidpresentation.off(event: SlidesEvent, handler: Function): void
type SlidesEvent = | 'slide:added' | 'slide:deleted' | 'slide:reordered' | 'slide:updated' | 'presentation:start' | 'presentation:end' | 'slide:change' // slide actual cambió durante la presentación | 'sync' | 'status'; // estado de la conexiónpresentation.export(format: 'pdf' | 'png', slideId?: string): Promise<Blob>presentation.exportUrl(format: 'pdf' | 'png', slideId?: string): stringDevuelve 503 cuando el binding BROWSER no está disponible.
Tipos TypeScript
Sección titulada «Tipos TypeScript»interface TransitionConfig { type: 'none' | 'fade' | 'slide' | 'convex' | 'concave' | 'zoom'; speed: 'fast' | 'default' | 'slow'; direction?: 'left' | 'right' | 'up' | 'down';}
interface TextStyle { fontSize?: number; fontFamily?: string; fontWeight?: 'normal' | 'bold'; color?: string; textAlign?: 'left' | 'center' | 'right';}
interface ImageOptions { width?: string; height?: string; align?: 'left' | 'center' | 'right'; caption?: string; alt?: string;}
interface EmbedOptions { width?: string; height?: string; allowFullscreen?: boolean;}
type SlideSpec = | { layout: string; [slot: string]: unknown; notes?: string; hidden?: boolean } | { html: string; notes?: string; hidden?: boolean }