summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gjs/src/jsx/jsx-runtime.ts65
1 files changed, 65 insertions, 0 deletions
diff --git a/gjs/src/jsx/jsx-runtime.ts b/gjs/src/jsx/jsx-runtime.ts
new file mode 100644
index 0000000..f7f0582
--- /dev/null
+++ b/gjs/src/jsx/jsx-runtime.ts
@@ -0,0 +1,65 @@
+import { Gtk, Astal } from "../imports.js"
+import * as Widget from "../widgets.js"
+
+export function jsx(
+ ctor: keyof typeof ctors | typeof Gtk.Widget,
+ { children, ...props }: any,
+) {
+ let ch: any[] = []
+ if (Array.isArray(children)) {
+ ch = children.map(v => {
+ if (v instanceof Gtk.Widget)
+ return v
+
+ return Widget.Label({ label: String(v) })
+ })
+ }
+ else if (children instanceof Gtk.Widget) {
+ ch = [children]
+ }
+
+ const widget = typeof ctor === "string"
+ ? (ctors as any)[ctor](props)
+ : new ctor(props)
+
+ if (widget instanceof Astal.CenterBox) {
+ if (ch[0])
+ widget.startWidget = ch[0]
+ if (ch[1])
+ widget.centerWidget = ch[1]
+ if (ch[2])
+ widget.endWidget = ch[2]
+ } else {
+ for (const w of ch) {
+ if (widget instanceof Gtk.Container)
+ widget.add(w)
+ }
+ }
+ return widget
+}
+
+const ctors = {
+ "box": Widget.Box,
+ "button": Widget.Button,
+ "centerbox": Widget.CenterBox,
+ "eventbox": Widget.EventBox,
+ "icon": Widget.Icon,
+ "label": Widget.Label,
+ "window": Widget.Window,
+}
+
+// eslint-disable-next-line @typescript-eslint/no-namespace
+export namespace JSX {
+ export type Element = Gtk.Widget
+ export interface IntrinsicElements {
+ "box": Widget.BoxProps
+ "button": Widget.ButtonProps
+ "centerbox": Widget.CenterBoxProps
+ "eventbox": Widget.EventBoxProps
+ "icon": Widget.IconProps
+ "label": Widget.LabelProps
+ "window": Widget.WindowProps
+ }
+}
+
+export const jsxs = jsx