JSX without React

Lately I've been playing around with A-Frame, a framework that allows you to build VR experiences using HTML.
My goal was to represent a directory tree as a series of platforms connected by paths, with spheres representing files.
This required creating and inserting DOM nodes for each directory or file, each with a few dynamic attributes.
Doing that with vanilla javascript became pretty tedious. Here's an example:
AFRAME.registerComponent('insert-box', { init() { const newBox = document.createElement('a-box'); newBox.setAttribute('position', { x: 0, y: 1, z: -3 }); newBox.setAttribute('color', '#4CC3D9'); newBox.setAttribute('rotation', { x: 0, y: 45, z: 0 }); newBox.setAttribute('height', 1); newBox.setAttribute('width', 1); newBox.setAttribute('material', 'side: double;'); const sceneEl = document.querySelector('a-scene'); sceneEl.appendChild(newBox); } })

With JSX

I've mostly been writing React lately and I've grown used to how easy JSX makes templating templating.
That made me think, can I use JSX for this usecase, but without React?
A package called jsx-dom does exactly that! Used as a Babel plugin, it transpiles JSX using document.createElement and element.setAttribute, allowing you to easily write dynamic html within js.
AFRAME.registerComponent('insert-box', { init() { const sceneEl = document.querySelector('a-scene'); sceneEl.appendChild( <a-box position={{ x: 0, y: 1, z: -3 }} color="#4CC3D9" height={1} width={1} rotation material={{ side: 'double' }} /> ); } });
This approach isn't an attempt to use any of the features of React. It is just some syntactic sugar for creating DOM nodes. But it makes my code a lot easier to reason about!

Why am I doing this?

This is all part of an ongoing effort to develop a VR representation of code. I'll be presenting my experiments at RubyConf Colombia on September 20th. I'll also be writing more about my experiments as I go, so if that sounds interesting, keep an eye out for more articles!