GUITKX — ReactiveUI for Godot
Editor support for .guitkx, the JSX-like markup of ReactiveUI for Godot — a React-style reactive UI library for Godot 4.x.
Features
- Syntax highlighting for the JSX-like markup and the embedded GDScript, via a self-contained TextMate grammar.
- Markup IntelliSense — completion and hover for host-element tags, structural/common attributes, control-flow directives (
@if/@elif/@else/@for/@while/@match/@case/@default), and per-element event handlers.
- Embedded-GDScript IntelliSense — completion and hover inside
{expr}, setup, and control-flow conditions, forwarded to Godot's own GDScript language server so you get real V.* / Hooks.* / Godot-API completion.
- Diagnostics for structural problems.
Requirements
- Node.js on your PATH (the bundled language server runs on Node).
- For embedded-GDScript intelligence: the Godot editor running with your project open and its GDScript language server enabled (Editor Settings → Network → Language Server; engine default port 6005).
Changelog
[0.2.4] - 2026-06-22
- Formatting: an authored blank line at the start or end of a component/hook setup block is now preserved (it was being stripped), and runs of 2+ spaces in embedded GDScript are collapsed to one outside strings/comments (e.g.
if x == null becomes if x == null).
- Diagnostics: an unknown element (GUITKX0105) and an unknown host attribute (GUITKX0107) are now reported as Errors (a red squiggle) instead of a faint hint / a warning.
- Completion: style-dict keys (
bg_color, corner_radius, pad, separation, expand_h, font_size, the theme channels, the per-state slots, …) are offered inside a style={ {…} } (or *_style) dictionary; common built-in constants (Color.WHITE, Vector2.ZERO, …) complete after Type.; and go-to-definition on an embedded GDScript symbol now forwards to Godot's language server (jumping to the library .gd, e.g. use_ref → core/hooks.gd) when the editor is running.
[0.2.3] - 2026-06-22
- Formatting now always uses tab indentation for
.guitkx (the embedded GDScript requires tabs, and the compiler emits tabs), so the markup and the embedded setup no longer mix indentation units — previously, with an editor configured for spaces, a deeper setup line kept its authored tab and produced a "2 spaces + tab" indent. Diagnostics: unknown attributes on a host element are now flagged (e.g. a typo'd te / xt on <Label>) with a did-you-mean suggestion, validated against the bundled Godot ClassDB property + signal data; component tags (which take arbitrary props) are not flagged, and the check is skipped when the ClassDB dump is unavailable so it never false-flags.
- Formatter configuration: a project
guitkx.config.json (Prettier-style walk-up, the analogue of ReactiveUIToolKit's uitkx.config.json) now overrides the formatter — printWidth, indentStyle ("tab" | "space"), indentSize, singleAttributePerLine, insertSpaceBeforeSelfClose. Tab indentation is the default when no config is present.
[0.2.1] - 2026-06-22
- Renamed the extension to just "GUITKX" (it was "GUITKX (ReactiveUI for Godot)", which truncated to "GUITKX (React..." in the editor UI) and added the Godot logo as the extension / marketplace icon.
[0.2.0] - 2026-06-22
- Formatter: components whose render is guarded by an early
return null (e.g. if not ready: return null before the real markup return) are now formatted instead of being left verbatim, and the multi-attribute wrap path honors the insertSpaceBeforeSelfClose option (it previously always inserted the space).
- Language server: hover and completion inside a
hook body now map to the correct embedded-GDScript offset (the body is no longer mis-mapped after re-indentation); a <>...</> fragment no longer raises a false GUITKX0104 duplicate-key warning across its siblings; and parameter completion is now noncode-aware, so a string default containing a comma or colon (e.g. label: String = "a, b") no longer drops the parameters declared after it.
- find-references and rename now use the exact jsx-as-value keyword boundaries the compiler uses (return / else / and only), so they never edit a
<Name that the compiler reads as a less-than comparison (e.g. after if, in, not, await, yield, or or).
- Control-flow inside an embedded expression that cannot be lowered to an expression (
@while / @match) now reports GUITKX0113 through the compiler-diagnostics sidecar; @if/@elif/@else and @for inside a {expression} or a lambda now compile correctly (inline ternary / .map).
[0.1.0] - 2026-06-21
- Initial release. Syntax highlighting and language intelligence for .guitkx markup (ReactiveUI for Godot): a self-contained TextMate grammar that colors both the JSX-like markup and the embedded GDScript; markup completion and hover for host-element tags, structural/common attributes, control-flow directives (@if/@elif/@else/@for/@while/@match/@case/@default) and per-element event handlers, served from the bundled schema; and embedded-GDScript completion/hover forwarded to Godot's built-in GDScript language server (TCP, engine port 6005) through a synthetic virtual .gd document with a length-preserving source map. Structural diagnostics (unbalanced braces) ship today; the Godot proxy degrades gracefully when the editor is not running so the markup features always work.
- Visual Studio 2022 extension registers the TextMate grammar via .pkgdef (VS does not colorize over LSP) and drives the same Node language server through an ILanguageClient. Requires Node.js on PATH.
| |