Pack contract
src/render/context.ts declares the pack's PackTypes once, and src/primitives/define.ts binds the SDK's definePrimitive to it so each primitive names only TNode:
// src/render/context.ts
export interface SlidePackTypes extends DefaultPackTypes {
theme: SlideFrameTheme;
context: SlideRenderContext;
}
// src/primitives/define.ts
export const definePrimitive = definePrimitiveFor<SlidePackTypes>();
theme— the palette lower bound this pack places on a frame.context— the Distillate class-name context the React renderers receive.SlideReactEnvisSurfaceMap<SlidePackTypes>['react']['env'], the oneenvtype everyreactrenderer in the pack is written against.
Everything else stays at the SDK default. A new pack declares its own PackTypes the same way.
src/pack.ts passes theme: themeBound<SlideFrameTheme>() and styleAdapter: createDistillateHtmlStyleAdapter(slideDistillery) to definePrimitivePack. The theme is the declared lower bound — what any runtime holding this pack must supply to its frames. The style adapter is this pack's CSS, which a runtime combines with every other pack's, and which the svg surface emits alongside the tree. Do not annotate the export as PrimitivePack<SlideFrameTheme>; derive it.
The pack declares no surfaces. svg is not declarable — every pack reaches it through its react renderers — and this pack renders Slack through the markdown fallback.
src/registry.ts is hand-maintained. It exports slideDeckPrimitives (the array) and slidePrimitiveTypes (the type strings). Keep it alphabetically sorted.