import type { ASCIIFontOptions, ASCIIFontRenderable, BaseRenderable, BoxOptions, BoxRenderable, CodeOptions, CodeRenderable, ImageRenderable, ImageRenderableOptions, InputRenderable, InputRenderableOptions, KeyEvent, MarkdownOptions, MarkdownRenderable, RenderableOptions, RenderContext, ScrollBoxOptions, ScrollBoxRenderable, SelectOption, SelectRenderable, SelectRenderableOptions, TabSelectOption, TabSelectRenderable, TabSelectRenderableOptions, TextareaOptions, TextareaRenderable, TextNodeRenderable, TextOptions, TextRenderable } from "@opentui/core"; import type { Ref } from "solid-js"; import type { JSX } from "../../jsx-runtime.js"; /** Properties that should not be included in the style prop */ export type NonStyledProps = "id" | "buffered" | "live" | "enableLayout" | "selectable" | "renderAfter" | "renderBefore" | `on${string}`; /** Solid-specific props for all components */ export type ElementProps = { ref?: Ref; [eventName: `on:${string}`]: ((...args: any[]) => void) | undefined; }; /** Base type for any renderable constructor */ export type RenderableConstructor = new (ctx: RenderContext, options: any) => TRenderable; /** Extract the options type from a renderable constructor */ type ExtractRenderableOptions = TConstructor extends new (ctx: RenderContext, options: infer TOptions) => any ? TOptions : never; /** Extract the renderable type from a constructor */ type ExtractRenderable = TConstructor extends new (ctx: RenderContext, options: any) => infer TRenderable ? TRenderable : never; /** Determine which properties should be excluded from styling for different renderable types */ export type GetNonStyledProperties = TConstructor extends RenderableConstructor ? NonStyledProps | "content" : TConstructor extends RenderableConstructor ? NonStyledProps | "title" | "bottomTitle" : TConstructor extends RenderableConstructor ? NonStyledProps | "text" | "selectable" : TConstructor extends RenderableConstructor ? NonStyledProps | "minLength" | "maxLength" | "placeholder" | "value" : TConstructor extends RenderableConstructor ? NonStyledProps | "content" | "filetype" | "syntaxStyle" | "treeSitterClient" : TConstructor extends RenderableConstructor ? NonStyledProps | "content" | "syntaxStyle" | "treeSitterClient" | "conceal" | "renderNode" : TConstructor extends RenderableConstructor ? NonStyledProps | "source" : NonStyledProps; /** Base props for container components that accept children */ type ContainerProps = TOptions & { children?: JSX.Element; }; /** Smart component props that automatically determine excluded properties */ type ComponentProps, TRenderable extends BaseRenderable> = TOptions & { style?: Partial>>>; } & ElementProps; /** Valid text content types for Text component children */ type TextChildren = string | number | boolean | null | undefined | JSX.Element; export type TextProps = ComponentProps & { children?: TextChildren | Array; }; export type SpanProps = ComponentProps<{}, TextNodeRenderable> & { children?: TextChildren | Array; }; export type LinkProps = SpanProps & { href: string; }; export type BoxProps = ComponentProps, BoxRenderable> & { focused?: boolean; }; export type InputProps = ComponentProps & { focused?: boolean; onInput?: (value: string) => void; onChange?: (value: string) => void; onSubmit?: (value: string) => void; }; export type TextareaProps = ComponentProps & { focused?: boolean; onSubmit?: () => void; onContentChange?: (value: string) => void; onCursorChange?: (value: { line: number; visualColumn: number; }) => void; onKeyDown?: (event: KeyEvent) => void; onKeyPress?: (event: KeyEvent) => void; }; export type SelectProps = ComponentProps & { focused?: boolean; onChange?: (index: number, option: SelectOption | null) => void; onSelect?: (index: number, option: SelectOption | null) => void; }; export type AsciiFontProps = ComponentProps; export type TabSelectProps = ComponentProps & { focused?: boolean; onChange?: (index: number, option: TabSelectOption | null) => void; onSelect?: (index: number, option: TabSelectOption | null) => void; }; export type ScrollBoxProps = ComponentProps, ScrollBoxRenderable> & { focused?: boolean; stickyScroll?: boolean; stickyStart?: "bottom" | "top" | "left" | "right"; }; export type CodeProps = ComponentProps; export type ImageProps = ComponentProps; export type MarkdownProps = ComponentProps; /** Convert renderable constructor to component props with proper style exclusions */ export type ExtendedComponentProps> = TOptions & { children?: JSX.Element; style?: Partial>>; } & ElementProps>; /** Helper type to create JSX element properties from a component catalogue */ export type ExtendedIntrinsicElements> = { [TComponentName in keyof TComponentCatalogue]: ExtendedComponentProps; }; /** * Global augmentation interface for extended components * This will be augmented by user code using module augmentation */ export interface OpenTUIComponents { [componentName: string]: RenderableConstructor; } export {};