export {}; // Ensure this file is treated as a module so 'declare global' works. type Observable = { readonly value?: T; subscribe(cb: (v: T) => void): { unsubscribe(): void } | (() => void); }; type Reactive = T | ((el: Node) => T) | Observable; type StyleValue = Reactive; type StyleObject = { [K in keyof CSSStyleDeclaration]?: StyleValue; }; type Primitive = string | number | boolean | null | undefined; type Renderable = | Node | Primitive | Renderable[] | ((element?: HTMLElement) => Renderable); /** * Constructs component prop types where each declared prop can be reactive. */ type ComponentProps

> = & { [K in keyof P]: Reactive; } & { children?: Renderable | Renderable[] | (() => Renderable | Renderable[]); }; /** * Component function shape for the MiniFramework. * - `this` is a DocumentFragment used as the component root container. * - Props are reactive-enabled. * - Return value can be a Renderable or a function producing a Renderable (for reactive subtree). */ interface MiniFWComponent

= {}> { (this: DocumentFragment, props: () => ComponentProps

): Renderable; } type ElementWithChildren = & { [K in Exclude]?: Exclude extends Function ? T[K] : Reactive; } & { style?: Reactive; onupdate?: (this: T, ev: Event & { target: T }) => any; onconnect?: (this: T, ev: Event & { target: T }) => any; ondisconnect?: (this: T, ev: Event & { target: T }) => any; key?: string; children?: any | undefined; }; type ElementWithoutChildren = & { [K in Exclude]?: Exclude extends Function ? T[K] : Reactive; } & { style?: Reactive; onupdate?: (this: T, ev: Event & { target: T }) => any; onconnect?: (this: T, ev: Event & { target: T }) => any; ondisconnect?: (this: T, ev: Event & { target: T }) => any; key?: string; }; /** * Global JSX namespace augmentation. */ declare global { namespace JSX { type Props = Record> = () => T; type PropsWithChildren< T extends Record = Record, > = () => T & { children: any; }; /** * The Element type encompasses all renderables including functions, * to allow returning a function directly from components. */ type Element = HTMLElement | null; type ElementType = // All the valid lowercase tags | keyof IntrinsicElements // Function components | ((props: any) => Element) | ((props: any) => () => Element); /** * IntrinsicElements: every tag name maps to permissive, reactive-capable props. * Specific refinement can be added later as needed. */ interface IntrinsicElements { html: ElementWithChildren; head: ElementWithChildren; title: ElementWithChildren; base: ElementWithoutChildren; link: ElementWithoutChildren; meta: ElementWithoutChildren; style: ElementWithChildren; body: ElementWithChildren; // Sectioning / grouping address: ElementWithChildren; article: ElementWithChildren; aside: ElementWithChildren; footer: ElementWithChildren; header: ElementWithChildren; main: ElementWithChildren; nav: ElementWithChildren; section: ElementWithChildren; div: ElementWithChildren; // Content h1: ElementWithChildren; h2: ElementWithChildren; h3: ElementWithChildren; h4: ElementWithChildren; h5: ElementWithChildren; h6: ElementWithChildren; hgroup: ElementWithChildren; p: ElementWithChildren; hr: ElementWithoutChildren; pre: ElementWithChildren; blockquote: ElementWithChildren; ol: ElementWithChildren; ul: ElementWithChildren; li: ElementWithChildren; dl: ElementWithChildren; dt: ElementWithChildren; dd: ElementWithChildren; figure: ElementWithChildren; figcaption: ElementWithChildren; // Inline / phrasing a: ElementWithChildren; em: ElementWithChildren; strong: ElementWithChildren; small: ElementWithChildren; s: ElementWithChildren; cite: ElementWithChildren; q: ElementWithChildren; dfn: ElementWithChildren; abbr: ElementWithChildren; data: ElementWithChildren; time: ElementWithChildren; code: ElementWithChildren; var: ElementWithChildren; samp: ElementWithChildren; kbd: ElementWithChildren; sub: ElementWithChildren; sup: ElementWithChildren; i: ElementWithChildren; b: ElementWithChildren; u: ElementWithChildren; mark: ElementWithChildren; ruby: ElementWithChildren; rt: ElementWithChildren; rp: ElementWithChildren; bdi: ElementWithChildren; bdo: ElementWithChildren; span: ElementWithChildren; br: ElementWithoutChildren; wbr: ElementWithoutChildren; // Forms form: ElementWithChildren< HTMLFormElement & { onsubmit: (this: HTMLFormElement, ev: SubmitEvent) => any; } >; label: ElementWithChildren< HTMLLabelElement & { for: string; } >; input: ElementWithoutChildren; button: ElementWithChildren; select: ElementWithChildren; datalist: ElementWithChildren; optgroup: ElementWithChildren; option: ElementWithChildren; textarea: ElementWithChildren; output: ElementWithChildren; progress: ElementWithChildren; meter: ElementWithChildren; fieldset: ElementWithChildren; legend: ElementWithChildren; // Interactive and media details: ElementWithChildren; summary: ElementWithChildren; dialog: ElementWithChildren; menu: ElementWithChildren; menuitem: ElementWithChildren; img: ElementWithoutChildren; iframe: ElementWithChildren; embed: ElementWithoutChildren; object: ElementWithChildren; param: ElementWithoutChildren; video: ElementWithChildren; audio: ElementWithChildren; source: ElementWithoutChildren; track: ElementWithoutChildren; canvas: ElementWithChildren; // Tables table: ElementWithChildren; caption: ElementWithChildren; colgroup: ElementWithChildren; col: ElementWithoutChildren; thead: ElementWithChildren; tbody: ElementWithChildren; tfoot: ElementWithChildren; tr: ElementWithChildren; td: ElementWithChildren; th: ElementWithChildren; // Metadata / scripting script: ElementWithChildren; noscript: ElementWithChildren; template: ElementWithChildren; // Fallback for any other intrinsic element. // Specific elements can be added above as needed. [elemName: string]: ElementWithChildren>; } /** * Allow components whose props are made reactive automatically. * (This does not change authoring but documents intent.) */ interface ElementChildrenAttribute { children: {}; // Enables `children` prop inference. } // Handle () => props by unwrapping to props. type UnwrapGetter = T extends () => infer O ? O : T; // Just alias the transformed props; JSX will use this. type LibraryManagedAttributes = UnwrapGetter

; } }