/** * Universal renderer abstraction for Radi. * * Goal: * - Allow creating alternative platform renderers (DOM, server string, custom targets). * - Mirror the idea of Solid's `createRenderer` but fitted to Radi's simplified * child + reactive generator model. * * This module does NOT implement full reactivity for non-DOM targets. Server * rendering performs a one-time render; reactive children/functions are invoked * immediately and flattened. * * To use: * import { createRenderer } from 'radi/src/renderer.ts'; * const { * render, * createElement, * createTextNode, * createComment, * toString // (if serialize capable) * } = createRenderer(domAdapter); * * For server: * const { * createElement, * renderToString * } = createRenderer(serverStringAdapter); * * NOTE: This abstraction is intentionally minimal to keep core size small. */ import type { Child } from "./types.js"; export interface UniversalNode { readonly node: unknown; children?: UniversalNode[]; text?: string; comment?: string; tag?: string; props?: Record; key?: string | null; } export interface RendererAdapter { createElement(tag: string): UniversalNode; createTextNode(text: string): UniversalNode; createComment(text: string): UniversalNode; setProperty(node: UniversalNode, name: string, value: unknown): void; insertNode(parent: UniversalNode, node: UniversalNode, anchor?: UniversalNode | null): void; removeNode(parent: UniversalNode, node: UniversalNode): void; getParentNode(node: UniversalNode): UniversalNode | null; getFirstChild(node: UniversalNode): UniversalNode | null; getNextSibling(node: UniversalNode): UniversalNode | null; isTextNode(node: UniversalNode): boolean; isCommentNode?(node: UniversalNode): boolean; serialize?(root: UniversalNode): string; } export interface Renderer { createElement(type: string | ComponentType, props: Record | null, ...children: Child[]): UniversalNode; createTextNode(text: string): UniversalNode; createComment(text: string): UniversalNode; render(root: UniversalNode, child: Child): UniversalNode; renderToString?(child: Child): string; fragment(children: Child[]): UniversalNode; } export type ComponentType = (props: () => Record) => Child | Child[]; export declare function createRenderer(adapter: RendererAdapter): Renderer; /** * A lightweight DOM adapter example for browsers. * This is intentionally minimal; real client integration likely uses existing main.ts APIs. */ export declare function createDomAdapter(doc?: Document): RendererAdapter; /** * Very small server adapter that builds a tree of virtual nodes and serializes to HTML. * This does not escape attributes rigorously (caller should ensure safe values). */ export declare function createServerStringAdapter(): RendererAdapter; export declare const DOM_RENDERER: Renderer; export declare const SERVER_RENDERER: Renderer;