diff --git a/packages/example/src/TestUi1Component.tsx b/packages/example/src/TestUi1Component.tsx index 52c806f..71ca6be 100644 --- a/packages/example/src/TestUi1Component.tsx +++ b/packages/example/src/TestUi1Component.tsx @@ -1,3 +1,17 @@ +import { Control } from "godot" +import { Node } from "react-godot-renderer" + + export function TestUi1Component() { - return + return ( + + ) } + +Node({ + class: Control, + +}) diff --git a/packages/react-godot-renderer/src/JSX.ts b/packages/react-godot-renderer/src/JSX.ts index 2e89d32..1d397d2 100644 --- a/packages/react-godot-renderer/src/JSX.ts +++ b/packages/react-godot-renderer/src/JSX.ts @@ -2,21 +2,21 @@ import type * as Godot from "godot" import type { PascalToCamel } from "./utils.js" -type NodeClass = { +export type NodeClass = { [K in keyof typeof Godot]: typeof Godot[K] extends new (...args: any[]) => Godot.Node ? K : never }[keyof typeof Godot] -type GodotIntrinsicElements = { +export type GodotIntrinsicElements = { [K in NodeClass as PascalToCamel]: PropsFromInstance> } & { - custom: { + element: { class: new (...args: any[]) => Godot.Node } } -type PropsFromInstance = { +export type PropsFromInstance = { // biome-ignore lint/complexity/noBannedTypes: it's completely fine [K in keyof T as T[K] extends Function ? never : K]?: T[K] } diff --git a/packages/react-godot-renderer/src/Node.ts b/packages/react-godot-renderer/src/Node.ts new file mode 100644 index 0000000..097b343 --- /dev/null +++ b/packages/react-godot-renderer/src/Node.ts @@ -0,0 +1,14 @@ +import type * as Godot from "godot" +import * as React from "react" +import type * as JSX from "./JSX.js" + + +export type NodeProps = { + readonly class: new (...args: any[]) => T +} & JSX.PropsFromInstance> + +export function Node( + props: NodeProps +): React.JSX.Element { + return React.createElement("element", props) +} diff --git a/packages/react-godot-renderer/src/Reconciler.ts b/packages/react-godot-renderer/src/Reconciler.ts index 6f5284c..f0a5f69 100644 --- a/packages/react-godot-renderer/src/Reconciler.ts +++ b/packages/react-godot-renderer/src/Reconciler.ts @@ -29,9 +29,9 @@ export const make = () => { createInstance(type, props) { let instance: Node - if (type === "custom") { + if (type === "element") { if (!hasProperty(props, "class")) - throw new Error("Property 'class' required when using the 'custom' intrinsic type") + throw new Error("Property 'class' required when using the 'element' intrinsic type") instance = new (props.class as any)() } else { diff --git a/packages/react-godot-renderer/src/index.ts b/packages/react-godot-renderer/src/index.ts index 3aa8306..b420194 100644 --- a/packages/react-godot-renderer/src/index.ts +++ b/packages/react-godot-renderer/src/index.ts @@ -1,3 +1,4 @@ export * as JSX from "./JSX.js" +export * from "./Node.js" export * as Reconciler from "./Reconciler.js" export * as Renderer from "./Renderer.js"