/** * Wires the document model to its rendering. * * `@chopin/dialect` stays headless so the server can use it, so decorator nodes * call out to whatever the UI registered. Importing this module is what makes * plan widgets render at all. */ import { setRenderer } from "@chopin/dialect"; import { renderDecision } from "./decision"; import { renderImage } from "./image"; import { renderQuestionnaire } from "./questionnaire"; import { renderResearch } from "./research"; import { renderExperiment } from "./experiment"; import type { ExperimentNode } from "@chopin/dialect"; import type { DecisionNode, ImageNode, QuestionnaireNode, ResearchNode } from "@chopin/dialect"; let registered = false; /** Idempotent: importing this from several entry points must not double-register. */ export function register(): void { if (registered) return; registered = true; setRenderer("plan-image", renderImage); setRenderer("plan-questionnaire", renderQuestionnaire); setRenderer("plan-decision", renderDecision); setRenderer("plan-research", renderResearch); setRenderer("plan-experiment", renderExperiment); } export { CalloutPlugin } from "./callout"; export { CardGapPlugin } from "./card-gap"; export { DecisionDeletionPlugin } from "./decision-deletion"; export { DecoratorSelectionPlugin } from "./decorator-selection"; export { DiscardedNavigationPlugin } from "./discarded-navigation"; export { EnterPlugin } from "./enter"; export { QuestionnaireCard } from "./questionnaire"; export type { QuestionnaireCardProps } from "./questionnaire"; export { PreviewPlugin } from "./render-blocks"; export { ResearchBrief, ResearchCard, ResearchComposer, ResearchDeletionPlugin, ResearchReference, } from "./research"; export { TabKeyPlugin } from "./tab-key"; export { TabsPlugin } from "./tabs";