<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.fightorder.net/wiki/index.php?action=history&amp;feed=atom&amp;title=Recoil%3ARmlUI_Starter_Guide</id>
	<title>Recoil:RmlUI Starter Guide - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.fightorder.net/wiki/index.php?action=history&amp;feed=atom&amp;title=Recoil%3ARmlUI_Starter_Guide"/>
	<link rel="alternate" type="text/html" href="https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;action=history"/>
	<updated>2026-04-21T00:58:02Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;diff=2708&amp;oldid=prev</id>
		<title>Qrow: Undo revision 2705 by Qrow (talk)</title>
		<link rel="alternate" type="text/html" href="https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;diff=2708&amp;oldid=prev"/>
		<updated>2026-03-06T06:18:21Z</updated>

		<summary type="html">&lt;p&gt;Undo revision &lt;a href=&quot;/wiki/index.php?title=Special:Diff/2705&quot; title=&quot;Special:Diff/2705&quot;&gt;2705&lt;/a&gt; by &lt;a href=&quot;/wiki/index.php?title=Special:Contributions/Qrow&quot; title=&quot;Special:Contributions/Qrow&quot;&gt;Qrow&lt;/a&gt; (&lt;a href=&quot;/wiki/index.php?title=User_talk:Qrow&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User talk:Qrow (page does not exist)&quot;&gt;talk&lt;/a&gt;)&lt;/p&gt;
&lt;a href=&quot;https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;amp;diff=2708&amp;amp;oldid=2707&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Qrow</name></author>
	</entry>
	<entry>
		<id>https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;diff=2707&amp;oldid=prev</id>
		<title>Qrow: Undo revision 2706 by Qrow (talk)</title>
		<link rel="alternate" type="text/html" href="https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;diff=2707&amp;oldid=prev"/>
		<updated>2026-03-06T06:18:13Z</updated>

		<summary type="html">&lt;p&gt;Undo revision &lt;a href=&quot;/wiki/index.php?title=Special:Diff/2706&quot; title=&quot;Special:Diff/2706&quot;&gt;2706&lt;/a&gt; by &lt;a href=&quot;/wiki/index.php?title=Special:Contributions/Qrow&quot; title=&quot;Special:Contributions/Qrow&quot;&gt;Qrow&lt;/a&gt; (&lt;a href=&quot;/wiki/index.php?title=User_talk:Qrow&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User talk:Qrow (page does not exist)&quot;&gt;talk&lt;/a&gt;)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 23:18, 5 March 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;+++&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;title = &#039;RmlUi&#039;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;date = 2025-05-11T13:17:05-07:00&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;draft = false&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;author = &quot;Slashscreen&quot;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;+++&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;RmlUi is a UI framework that is defined using a HTML/CSS style workflow (using Lua instead of JS) intended to simplify UI development especially for those already familiar with web development. It is designed for interactive applications, and so is reactive by default. You can learn more about it on the [RmlUI website] and [differences in the Recoil version here](#differences-between-upstream-rmlui-and-rmlui-in-recoil).&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;RmlUi is a UI framework that is defined using a HTML/CSS style workflow (using Lua instead of JS) intended to simplify UI development especially for those already familiar with web development. It is designed for interactive applications, and so is reactive by default. You can learn more about it on the [RmlUI website] and [differences in the Recoil version here](#differences-between-upstream-rmlui-and-rmlui-in-recoil).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# How does RmlUI Work?&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#&lt;/ins&gt;# How does RmlUI Work?&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;To get started, it&amp;#039;s important to learn a few key concepts.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;To get started, it&amp;#039;s important to learn a few key concepts.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l18&quot;&gt;Line 18:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 23:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;As each widget/component you create will likely comprise of several files (.lua, .rml &amp;amp; .rcss) you may find having a folder for each widget/component a useful way to organise your files.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;As each widget/component you create will likely comprise of several files (.lua, .rml &amp;amp; .rcss) you may find having a folder for each widget/component a useful way to organise your files.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Getting Started&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#&lt;/ins&gt;# Getting Started&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;RmlUi is available in LuaUI (the game UI) with future availability in LuaIntro &amp;amp; LuaMenu planned, so it is already there for you to use.  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;RmlUi is available in LuaUI (the game UI) with future availability in LuaIntro &amp;amp; LuaMenu planned, so it is already there for you to use.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l24&quot;&gt;Line 24:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 29:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;If you are working on a widget for an existing game, it is likely that the game already has some form of this setup code in, so you may be able to skip this section.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;If you are working on a widget for an existing game, it is likely that the game already has some form of this setup code in, so you may be able to skip this section.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Setup script&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;##&lt;/ins&gt;# Setup script&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Here is the &amp;quot;[handler](https://github.com/beyond-all-reason/Beyond-All-Reason/blob/master/luaui/rml_setup.lua)&amp;quot;, written by lov and ChrisFloofyKitsune, 2 of the people responsible for the RmlUi implementation.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Here is the &amp;quot;[handler](https://github.com/beyond-all-reason/Beyond-All-Reason/blob/master/luaui/rml_setup.lua)&amp;quot;, written by lov and ChrisFloofyKitsune, 2 of the people responsible for the RmlUi implementation.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Qrow</name></author>
	</entry>
	<entry>
		<id>https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;diff=2706&amp;oldid=prev</id>
		<title>Qrow at 06:16, 6 March 2026</title>
		<link rel="alternate" type="text/html" href="https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;diff=2706&amp;oldid=prev"/>
		<updated>2026-03-06T06:16:54Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 23:16, 5 March 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;+++&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;title = &#039;RmlUi&#039;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;date = 2025-05-11T13:17:05-07:00&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;draft = false&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;author = &quot;Slashscreen&quot;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;+++&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;RmlUi is a UI framework that is defined using a HTML/CSS style workflow (using Lua instead of JS) intended to simplify UI development especially for those already familiar with web development. It is designed for interactive applications, and so is reactive by default. You can learn more about it on the [RmlUI website] and [differences in the Recoil version here](#differences-between-upstream-rmlui-and-rmlui-in-recoil).&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;RmlUi is a UI framework that is defined using a HTML/CSS style workflow (using Lua instead of JS) intended to simplify UI development especially for those already familiar with web development. It is designed for interactive applications, and so is reactive by default. You can learn more about it on the [RmlUI website] and [differences in the Recoil version here](#differences-between-upstream-rmlui-and-rmlui-in-recoil).&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#&lt;/del&gt;# How does RmlUI Work?&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# How does RmlUI Work?&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;To get started, it&amp;#039;s important to learn a few key concepts.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;To get started, it&amp;#039;s important to learn a few key concepts.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l23&quot;&gt;Line 23:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 18:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;As each widget/component you create will likely comprise of several files (.lua, .rml &amp;amp; .rcss) you may find having a folder for each widget/component a useful way to organise your files.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;As each widget/component you create will likely comprise of several files (.lua, .rml &amp;amp; .rcss) you may find having a folder for each widget/component a useful way to organise your files.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;#&lt;/del&gt;# Getting Started&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Getting Started&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;RmlUi is available in LuaUI (the game UI) with future availability in LuaIntro &amp;amp; LuaMenu planned, so it is already there for you to use.  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;RmlUi is available in LuaUI (the game UI) with future availability in LuaIntro &amp;amp; LuaMenu planned, so it is already there for you to use.  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l29&quot;&gt;Line 29:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 24:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;If you are working on a widget for an existing game, it is likely that the game already has some form of this setup code in, so you may be able to skip this section.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;If you are working on a widget for an existing game, it is likely that the game already has some form of this setup code in, so you may be able to skip this section.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;##&lt;/del&gt;# Setup script&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Setup script&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Here is the &amp;quot;[handler](https://github.com/beyond-all-reason/Beyond-All-Reason/blob/master/luaui/rml_setup.lua)&amp;quot;, written by lov and ChrisFloofyKitsune, 2 of the people responsible for the RmlUi implementation.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Here is the &amp;quot;[handler](https://github.com/beyond-all-reason/Beyond-All-Reason/blob/master/luaui/rml_setup.lua)&amp;quot;, written by lov and ChrisFloofyKitsune, 2 of the people responsible for the RmlUi implementation.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Qrow</name></author>
	</entry>
	<entry>
		<id>https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;diff=2705&amp;oldid=prev</id>
		<title>Qrow at 06:16, 6 March 2026</title>
		<link rel="alternate" type="text/html" href="https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;diff=2705&amp;oldid=prev"/>
		<updated>2026-03-06T06:16:34Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;amp;diff=2705&amp;amp;oldid=2704&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Qrow</name></author>
	</entry>
	<entry>
		<id>https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;diff=2704&amp;oldid=prev</id>
		<title>Qrow: Undo revision 2703 by Qrow (talk)</title>
		<link rel="alternate" type="text/html" href="https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;diff=2704&amp;oldid=prev"/>
		<updated>2026-03-06T06:15:42Z</updated>

		<summary type="html">&lt;p&gt;Undo revision &lt;a href=&quot;/wiki/index.php?title=Special:Diff/2703&quot; title=&quot;Special:Diff/2703&quot;&gt;2703&lt;/a&gt; by &lt;a href=&quot;/wiki/index.php?title=Special:Contributions/Qrow&quot; title=&quot;Special:Contributions/Qrow&quot;&gt;Qrow&lt;/a&gt; (&lt;a href=&quot;/wiki/index.php?title=User_talk:Qrow&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User talk:Qrow (page does not exist)&quot;&gt;talk&lt;/a&gt;)&lt;/p&gt;
&lt;a href=&quot;https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;amp;diff=2704&amp;amp;oldid=2703&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Qrow</name></author>
	</entry>
	<entry>
		<id>https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;diff=2703&amp;oldid=prev</id>
		<title>Qrow at 06:02, 6 March 2026</title>
		<link rel="alternate" type="text/html" href="https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;diff=2703&amp;oldid=prev"/>
		<updated>2026-03-06T06:02:34Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;amp;diff=2703&amp;amp;oldid=2680&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Qrow</name></author>
	</entry>
	<entry>
		<id>https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;diff=2680&amp;oldid=prev</id>
		<title>Qrow: Created page with &quot;{{DISPLAYTITLE:RmlUI Starter Guide}} __TOC__  = RmlUI Starter Guide =  &#039;&#039;&#039;&#039;&#039;For RecoilEngine game developers — build reactive, HTML/CSS-style game UIs in Lua.&#039;&#039;&#039;&#039;&#039;  {| class=&quot;wikitable&quot; ! Attribute !! Value |- | Engine || RecoilEngine (Spring) |- | Framework || RmlUi ([https://github.com/mikke89/RmlUi mikke89/RmlUi]) |- | Language || Lua (via sol2 bindings) |- | Availability || LuaUI (LuaIntro / LuaMenu planned) |}  ----  == 1. Introduction ==  RmlUI is a UI framework...&quot;</title>
		<link rel="alternate" type="text/html" href="https://www.fightorder.net/wiki/index.php?title=Recoil:RmlUI_Starter_Guide&amp;diff=2680&amp;oldid=prev"/>
		<updated>2026-03-05T05:20:03Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;{{DISPLAYTITLE:RmlUI Starter Guide}} __TOC__  = RmlUI Starter Guide =  &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;For RecoilEngine game developers — build reactive, HTML/CSS-style game UIs in Lua.&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;  {| class=&amp;quot;wikitable&amp;quot; ! Attribute !! Value |- | Engine || RecoilEngine (Spring) |- | Framework || RmlUi ([https://github.com/mikke89/RmlUi mikke89/RmlUi]) |- | Language || Lua (via sol2 bindings) |- | Availability || LuaUI (LuaIntro / LuaMenu planned) |}  ----  == 1. Introduction ==  RmlUI is a UI framework...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{DISPLAYTITLE:RmlUI Starter Guide}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= RmlUI Starter Guide =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;For RecoilEngine game developers — build reactive, HTML/CSS-style game UIs in Lua.&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Attribute !! Value&lt;br /&gt;
|-&lt;br /&gt;
| Engine || RecoilEngine (Spring)&lt;br /&gt;
|-&lt;br /&gt;
| Framework || RmlUi ([https://github.com/mikke89/RmlUi mikke89/RmlUi])&lt;br /&gt;
|-&lt;br /&gt;
| Language || Lua (via sol2 bindings)&lt;br /&gt;
|-&lt;br /&gt;
| Availability || LuaUI (LuaIntro / LuaMenu planned)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 1. Introduction ==&lt;br /&gt;
&lt;br /&gt;
RmlUI is a UI framework that lets you build reactive game interfaces using an HTML/CSS-style workflow — with Lua instead of JavaScript. If you have ever built a web page, the learning curve is gentle. If you haven&amp;#039;t, the concepts are still approachable because the mental model (mark-up + style + logic) is widely documented.&lt;br /&gt;
&lt;br /&gt;
RecoilEngine ships with a full RmlUI integration including:&lt;br /&gt;
&lt;br /&gt;
* An OpenGL 3 renderer tightly coupled to the engine&amp;#039;s rendering pipeline&lt;br /&gt;
* A virtual-filesystem-aware file loader so your &amp;lt;code&amp;gt;.rml&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.rcss&amp;lt;/code&amp;gt; files live inside game archives&lt;br /&gt;
* Complete Lua bindings via sol2 so every RmlUI object is accessible from Lua&lt;br /&gt;
* Custom elements: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;texture&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; for engine textures and &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;svg&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; for vector art&lt;br /&gt;
* A built-in DOM debugger for interactive inspection&lt;br /&gt;
&lt;br /&gt;
This guide walks you through everything you need to get a working, reactive widget running in LuaUI. The examples are game-engine-agnostic and safe to copy into any Recoil-based game.&lt;br /&gt;
&lt;br /&gt;
{{Note|RmlUI is currently available in &amp;#039;&amp;#039;&amp;#039;LuaUI&amp;#039;&amp;#039;&amp;#039; (the in-game UI). Support for LuaIntro and LuaMenu is planned for a future release.}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 2. Key Concepts ==&lt;br /&gt;
&lt;br /&gt;
Before writing any code it helps to understand the five core objects:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Concept !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Context&amp;#039;&amp;#039;&amp;#039; || A named container that holds documents and data models. Multiple contexts can exist simultaneously, each rendered independently.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Document&amp;#039;&amp;#039;&amp;#039; || A parsed RML file representing a DOM tree. Documents live inside a Context and can be shown, hidden, or closed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;RML&amp;#039;&amp;#039;&amp;#039; || The markup language for documents. Very similar to XHTML (well-formed XML). The root tag is &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;rml&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;html&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;RCSS&amp;#039;&amp;#039;&amp;#039; || The styling language. Similar to CSS2 with some differences (see section 11). File extension: &amp;lt;code&amp;gt;.rcss&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Data Model&amp;#039;&amp;#039;&amp;#039; || A Lua table exposed to the RML document via reactive data bindings. Changes to the model automatically update the rendered UI.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On the &amp;#039;&amp;#039;&amp;#039;Lua side&amp;#039;&amp;#039;&amp;#039; you create contexts, attach data models to them, and load documents. On the &amp;#039;&amp;#039;&amp;#039;RML side&amp;#039;&amp;#039;&amp;#039; you declare your UI structure and reference data-model values through data bindings.&lt;br /&gt;
&lt;br /&gt;
Each widget will typically consist of at least three files: a &amp;lt;code&amp;gt;.lua&amp;lt;/code&amp;gt;, a &amp;lt;code&amp;gt;.rml&amp;lt;/code&amp;gt;, and optionally a &amp;lt;code&amp;gt;.rcss&amp;lt;/code&amp;gt; file — grouping them in a folder per widget keeps things tidy.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 3. Setup ==&lt;br /&gt;
&lt;br /&gt;
RecoilEngine ships a minimal setup script at &amp;lt;code&amp;gt;cont/LuaUI/rml_setup.lua&amp;lt;/code&amp;gt;. It is included automatically by the base content handler but you should understand what it does so you can extend it for your game.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 The rml_setup.lua script ===&lt;br /&gt;
&lt;br /&gt;
The script performs three tasks: guards against double-initialisation, loads font faces, and registers mouse-cursor aliases. Below is a more complete version that also creates a shared context and configures dp scaling:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
--  luaui/rml_setup.lua&lt;br /&gt;
--  author:  lov + ChrisFloofyKitsune&lt;br /&gt;
--  License: GNU GPL, v2 or later&lt;br /&gt;
&lt;br /&gt;
if (RmlGuard or not RmlUi) then&lt;br /&gt;
    return&lt;br /&gt;
end&lt;br /&gt;
-- Prevent this from running more than once&lt;br /&gt;
RmlGuard = true&lt;br /&gt;
&lt;br /&gt;
-- Patch CreateContext to set dp_ratio automatically&lt;br /&gt;
local oldCreateContext = RmlUi.CreateContext&lt;br /&gt;
local function NewCreateContext(name)&lt;br /&gt;
    local context = oldCreateContext(name)&lt;br /&gt;
    local viewSizeX, viewSizeY = Spring.GetViewGeometry()&lt;br /&gt;
    local userScale = Spring.GetConfigFloat(&amp;quot;ui_scale&amp;quot;, 1)&lt;br /&gt;
    local baseWidth, baseHeight = 1920, 1080&lt;br /&gt;
    local resFactor = math.min(viewSizeX / baseWidth, viewSizeY / baseHeight)&lt;br /&gt;
    -- Floor to 2 decimal places to avoid floating point drift&lt;br /&gt;
    context.dp_ratio = math.floor(resFactor * userScale * 100) / 100&lt;br /&gt;
    return context&lt;br /&gt;
end&lt;br /&gt;
RmlUi.CreateContext = NewCreateContext&lt;br /&gt;
&lt;br /&gt;
-- Load fonts (list your .ttf files here)&lt;br /&gt;
local font_files = {&lt;br /&gt;
    -- &amp;quot;Fonts/MyFont-Regular.ttf&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
for _, file in ipairs(font_files) do&lt;br /&gt;
    RmlUi.LoadFontFace(file, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Map CSS cursor names to engine cursor names&lt;br /&gt;
-- CSS cursor list: https://developer.mozilla.org/en-US/docs/Web/CSS/cursor&lt;br /&gt;
RmlUi.SetMouseCursorAlias(&amp;quot;default&amp;quot;, &amp;#039;cursornormal&amp;#039;)&lt;br /&gt;
RmlUi.SetMouseCursorAlias(&amp;quot;move&amp;quot;,    &amp;#039;uimove&amp;#039;)&lt;br /&gt;
RmlUi.SetMouseCursorAlias(&amp;quot;pointer&amp;quot;, &amp;#039;Move&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
-- Create the shared context used by all widgets&lt;br /&gt;
RmlUi.CreateContext(&amp;quot;shared&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Including the setup in main.lua ===&lt;br /&gt;
&lt;br /&gt;
Add a single line to &amp;lt;code&amp;gt;luaui/main.lua&amp;lt;/code&amp;gt; to run the setup before any widgets load:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- luaui/main.lua&lt;br /&gt;
VFS.Include(LUAUI_DIRNAME .. &amp;quot;rml_setup.lua&amp;quot;, nil, VFS.ZIP)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|The base-content &amp;lt;code&amp;gt;rml_setup.lua&amp;lt;/code&amp;gt; only loads a font and sets cursor aliases; it does &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; create a context. If you are building a new game you should add context creation here or let each widget create its own context.}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 4. Writing Your First Document (.rml) ==&lt;br /&gt;
&lt;br /&gt;
Create a file at &amp;lt;code&amp;gt;luaui/widgets/my_widget/my_widget.rml&amp;lt;/code&amp;gt;. RML is well-formed XML, so every tag must be closed and attribute values must be quoted.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Root structure ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;rml&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;My Widget&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;!-- External stylesheet (optional) --&amp;gt;&lt;br /&gt;
    &amp;lt;link type=&amp;quot;text/rcss&amp;quot; href=&amp;quot;my_widget.rcss&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Inline styles --&amp;gt;&lt;br /&gt;
    &amp;lt;style&amp;gt;&lt;br /&gt;
        body { margin: 0; padding: 0; }&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- Your content here --&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/rml&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4.2 Styles (inline and .rcss) ===&lt;br /&gt;
&lt;br /&gt;
RmlUI starts with &amp;#039;&amp;#039;&amp;#039;no default styles&amp;#039;&amp;#039;&amp;#039; at all — not even block/inline defaults. The RmlUI docs provide an HTML4 base stylesheet you can copy in, but you will need to add form element styles yourself.&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;dp&amp;lt;/code&amp;gt; units instead of &amp;lt;code&amp;gt;px&amp;lt;/code&amp;gt; so your UI scales correctly with the player&amp;#039;s display and &amp;lt;code&amp;gt;ui_scale&amp;lt;/code&amp;gt; setting.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;css&amp;quot;&amp;gt;&lt;br /&gt;
/* Typical widget container */&lt;br /&gt;
#my-widget {&lt;br /&gt;
    position: absolute;&lt;br /&gt;
    width: 400dp;&lt;br /&gt;
    right: 10dp;&lt;br /&gt;
    top: 50%;&lt;br /&gt;
    transform: translateY(-50%);&lt;br /&gt;
    pointer-events: auto;   /* required to receive mouse input */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#my-widget .panel {&lt;br /&gt;
    padding: 10dp;&lt;br /&gt;
    border-radius: 8dp;&lt;br /&gt;
    border: 1dp #6c7086;   /* note: no &amp;#039;solid&amp;#039; keyword – see section 11 */&lt;br /&gt;
    background-color: rgba(30, 30, 46, 200);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4.3 Data bindings in RML ===&lt;br /&gt;
&lt;br /&gt;
Attach a data model to a root element with &amp;lt;code&amp;gt;data-model=&amp;quot;model_name&amp;quot;&amp;lt;/code&amp;gt;. All data binding attributes inside that element can reference the model.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
  &amp;lt;!-- data-model scopes all bindings inside this div --&amp;gt;&lt;br /&gt;
  &amp;lt;div id=&amp;quot;my-widget&amp;quot; data-model=&amp;quot;my_model&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- Text interpolation --&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;Status: {{status_message}}&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- Conditional visibility --&amp;gt;&lt;br /&gt;
    &amp;lt;div data-if=&amp;quot;show_details&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;p&amp;gt;Extra details go here.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- Dynamic class based on model value --&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;panel&amp;quot; data-class-active=&amp;quot;is_active&amp;quot;&amp;gt;&lt;br /&gt;
        Active panel&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- Loop over an array --&amp;gt;&lt;br /&gt;
    &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li data-for=&amp;quot;item, i: items&amp;quot;&amp;gt;{{i}}: {{item.label}}&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- Two-way checkbox binding --&amp;gt;&lt;br /&gt;
    &amp;lt;input type=&amp;quot;checkbox&amp;quot; data-checked=&amp;quot;is_enabled&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;!-- Data event: calls model function on click --&amp;gt;&lt;br /&gt;
    &amp;lt;button data-click=&amp;quot;on_button_click()&amp;quot;&amp;gt;Click me&amp;lt;/button&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Data binding reference:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Binding !! Effect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{value}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; || Interpolate model value as text&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;data-model=&amp;quot;name&amp;quot;&amp;lt;/code&amp;gt; || Attach named data model to this element and its children&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;data-if=&amp;quot;flag&amp;quot;&amp;lt;/code&amp;gt; || Show element only when flag is truthy&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;data-class-X=&amp;quot;flag&amp;quot;&amp;lt;/code&amp;gt; || Add class X when flag is truthy&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;data-for=&amp;quot;v, i: arr&amp;quot;&amp;lt;/code&amp;gt; || Repeat element for each item in array arr&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;data-checked=&amp;quot;val&amp;quot;&amp;lt;/code&amp;gt; || Two-way bind checkbox to boolean model value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;data-click=&amp;quot;fn()&amp;quot;&amp;lt;/code&amp;gt; || Call model function on click (data event)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;data-attr-src=&amp;quot;val&amp;quot;&amp;lt;/code&amp;gt; || Dynamically set the src attribute from model value&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 5. The Lua Widget ==&lt;br /&gt;
&lt;br /&gt;
Each widget is a Lua file that the handler loads. The &amp;lt;code&amp;gt;widget&amp;lt;/code&amp;gt; global is injected by the widget handler and provides the lifecycle hooks.&lt;br /&gt;
&lt;br /&gt;
=== 5.1 Widget skeleton ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- luaui/widgets/my_widget/my_widget.lua&lt;br /&gt;
if not RmlUi then return end   -- guard: RmlUi not available&lt;br /&gt;
&lt;br /&gt;
local widget = widget ---@type Widget&lt;br /&gt;
&lt;br /&gt;
function widget:GetInfo()&lt;br /&gt;
    return {&lt;br /&gt;
        name    = &amp;quot;My Widget&amp;quot;,&lt;br /&gt;
        desc    = &amp;quot;Demonstrates RmlUI basics.&amp;quot;,&lt;br /&gt;
        author  = &amp;quot;YourName&amp;quot;,&lt;br /&gt;
        date    = &amp;quot;2025&amp;quot;,&lt;br /&gt;
        license = &amp;quot;GNU GPL, v2 or later&amp;quot;,&lt;br /&gt;
        layer   = 0,&lt;br /&gt;
        enabled = true,&lt;br /&gt;
    }&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5.2 Loading the document ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local RML_FILE  = &amp;quot;luaui/widgets/my_widget/my_widget.rml&amp;quot;&lt;br /&gt;
local MODEL_NAME = &amp;quot;my_model&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local rml_ctx    -- the RmlUi Context&lt;br /&gt;
local dm_handle  -- the DataModel handle (MUST be kept – see section 6)&lt;br /&gt;
local document   -- the loaded Document&lt;br /&gt;
&lt;br /&gt;
-- Initial data model state&lt;br /&gt;
local init_model = {&lt;br /&gt;
    status_message = &amp;quot;Ready&amp;quot;,&lt;br /&gt;
    is_enabled     = false,&lt;br /&gt;
    show_details   = false,&lt;br /&gt;
    items = {&lt;br /&gt;
        { label = &amp;quot;Alpha&amp;quot;, value = 1 },&lt;br /&gt;
        { label = &amp;quot;Beta&amp;quot;,  value = 2 },&lt;br /&gt;
    },&lt;br /&gt;
    -- Functions can live in the model too (callable from data-events)&lt;br /&gt;
    on_button_click = function()&lt;br /&gt;
        Spring.Echo(&amp;quot;Button was clicked!&amp;quot;)&lt;br /&gt;
    end,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function widget:Initialize()&lt;br /&gt;
    rml_ctx = RmlUi.GetContext(&amp;quot;shared&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    -- IMPORTANT: assign dm_handle or the engine WILL crash on RML render&lt;br /&gt;
    dm_handle = rml_ctx:OpenDataModel(MODEL_NAME, init_model)&lt;br /&gt;
    if not dm_handle then&lt;br /&gt;
        Spring.Echo(&amp;quot;[my_widget] Failed to open data model&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    document = rml_ctx:LoadDocument(RML_FILE, widget)&lt;br /&gt;
    if not document then&lt;br /&gt;
        Spring.Echo(&amp;quot;[my_widget] Failed to load document&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    document:ReloadStyleSheet()&lt;br /&gt;
    document:Show()&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 5.3 Shutting down cleanly ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
function widget:Shutdown()&lt;br /&gt;
    if document then&lt;br /&gt;
        document:Close()&lt;br /&gt;
        document = nil&lt;br /&gt;
    end&lt;br /&gt;
    -- Remove the model from the context; frees memory&lt;br /&gt;
    rml_ctx:RemoveDataModel(MODEL_NAME)&lt;br /&gt;
    dm_handle = nil&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 6. Data Models in Depth ==&lt;br /&gt;
&lt;br /&gt;
=== 6.1 Opening a data model ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;context:OpenDataModel(name, table)&amp;lt;/code&amp;gt; copies the structure of the table into a reactive proxy. The name must match the &amp;lt;code&amp;gt;data-model=&amp;quot;name&amp;quot;&amp;lt;/code&amp;gt; attribute in your RML. It must be unique within the context.&lt;br /&gt;
&lt;br /&gt;
{{Warning|You &amp;#039;&amp;#039;&amp;#039;must&amp;#039;&amp;#039;&amp;#039; store the return value of &amp;lt;code&amp;gt;OpenDataModel&amp;lt;/code&amp;gt; in a variable. Letting it be garbage-collected while the document is open will crash the engine the next time RmlUI tries to render a data binding.}}&lt;br /&gt;
&lt;br /&gt;
=== 6.2 Reading and writing values ===&lt;br /&gt;
&lt;br /&gt;
For simple string/number/boolean values at the top level of the model you can use dot-notation directly on the handle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Read a value&lt;br /&gt;
local msg = dm_handle.status_message   -- works&lt;br /&gt;
&lt;br /&gt;
-- Write a value (auto-marks the field dirty; UI updates next frame)&lt;br /&gt;
dm_handle.status_message = &amp;quot;Unit selected&amp;quot;&lt;br /&gt;
dm_handle.is_enabled     = true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6.3 Iterating arrays ===&lt;br /&gt;
&lt;br /&gt;
Because the handle is a sol2 proxy, you cannot iterate it directly with &amp;lt;code&amp;gt;pairs&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ipairs&amp;lt;/code&amp;gt;. Call &amp;lt;code&amp;gt;dm_handle:__GetTable()&amp;lt;/code&amp;gt; to get the underlying Lua table:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local tbl = dm_handle:__GetTable()&lt;br /&gt;
&lt;br /&gt;
for i, item in ipairs(tbl.items) do&lt;br /&gt;
    Spring.Echo(i, item.label, item.value)&lt;br /&gt;
    item.value = item.value + 1   -- modify in place&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6.4 Marking dirty ===&lt;br /&gt;
&lt;br /&gt;
When you modify nested values (e.g. elements inside an array) through &amp;lt;code&amp;gt;__GetTable()&amp;lt;/code&amp;gt;, you must tell the model which top-level key changed so that RmlUI re-renders the bound elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- After modifying tbl.items …&lt;br /&gt;
dm_handle:__SetDirty(&amp;quot;items&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
-- For a simple top-level assignment via dm_handle.key = value,&lt;br /&gt;
-- dirty-marking is done automatically.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 7. Events ==&lt;br /&gt;
&lt;br /&gt;
Recoil&amp;#039;s RmlUI supports two distinct event families. They look similar but have different scopes — mixing them up is a common source of confusion.&lt;br /&gt;
&lt;br /&gt;
=== 7.1 Normal events (on*) ===&lt;br /&gt;
&lt;br /&gt;
Written as &amp;lt;code&amp;gt;onclick=&amp;quot;myFunc()&amp;quot;&amp;lt;/code&amp;gt;. The function is resolved from the &amp;#039;&amp;#039;&amp;#039;second argument&amp;#039;&amp;#039;&amp;#039; passed to &amp;lt;code&amp;gt;LoadDocument&amp;lt;/code&amp;gt; — the widget table. These events do &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; have access to the data model.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Lua&lt;br /&gt;
local doc_scope = {&lt;br /&gt;
    greet = function(name)&lt;br /&gt;
        Spring.Echo(&amp;quot;Hello&amp;quot;, name)&lt;br /&gt;
    end,&lt;br /&gt;
}&lt;br /&gt;
document = rml_ctx:LoadDocument(RML_FILE, doc_scope)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- RML --&amp;gt;&lt;br /&gt;
&amp;lt;button onclick=&amp;quot;greet(&amp;#039;World&amp;#039;)&amp;quot;&amp;gt;Say hello&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7.2 Data events (data-*) ===&lt;br /&gt;
&lt;br /&gt;
Written as &amp;lt;code&amp;gt;data-click=&amp;quot;fn()&amp;quot;&amp;lt;/code&amp;gt;. The function is resolved from the &amp;#039;&amp;#039;&amp;#039;data model&amp;#039;&amp;#039;&amp;#039;. These events have full access to all model values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Lua model&lt;br /&gt;
local init_model = {&lt;br /&gt;
    counter = 0,&lt;br /&gt;
    increment = function()&lt;br /&gt;
        -- dm_handle is captured in the closure&lt;br /&gt;
        dm_handle.counter = dm_handle.counter + 1&lt;br /&gt;
    end,&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- RML --&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Count: {{counter}}&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;button data-click=&amp;quot;increment()&amp;quot;&amp;gt;+1&amp;lt;/button&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Event type comparison:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type !! Syntax example !! Scope&lt;br /&gt;
|-&lt;br /&gt;
| Normal || &amp;lt;code&amp;gt;onclick=&amp;quot;fn()&amp;quot;&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;LoadDocument&amp;lt;/code&amp;gt; second argument (widget table)&lt;br /&gt;
|-&lt;br /&gt;
| Data || &amp;lt;code&amp;gt;data-click=&amp;quot;fn()&amp;quot;&amp;lt;/code&amp;gt; || Data model table&lt;br /&gt;
|-&lt;br /&gt;
| Normal || &amp;lt;code&amp;gt;onmouseover=&amp;quot;fn()&amp;quot;&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;LoadDocument&amp;lt;/code&amp;gt; second argument&lt;br /&gt;
|-&lt;br /&gt;
| Data || &amp;lt;code&amp;gt;data-mouseover=&amp;quot;fn()&amp;quot;&amp;lt;/code&amp;gt; || Data model table&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 8. Custom Recoil Elements ==&lt;br /&gt;
&lt;br /&gt;
Beyond standard HTML elements, Recoil adds two custom RML elements.&lt;br /&gt;
&lt;br /&gt;
=== 8.1 The &amp;amp;lt;texture&amp;amp;gt; element ===&lt;br /&gt;
&lt;br /&gt;
Renders any engine texture — unit icons, map thumbnails, GL4 render targets, etc. Behaves identically to &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;img&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; except the &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; attribute takes a &amp;#039;&amp;#039;&amp;#039;Recoil texture reference string&amp;#039;&amp;#039;&amp;#039; (see engine docs for the full format).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- Load a file from VFS --&amp;gt;&lt;br /&gt;
&amp;lt;texture src=&amp;quot;unitpics/armcom.png&amp;quot; width=&amp;quot;64dp&amp;quot; height=&amp;quot;64dp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Reference a named GL texture --&amp;gt;&lt;br /&gt;
&amp;lt;texture src=&amp;quot;%luaui:myTextureName&amp;quot; width=&amp;quot;128dp&amp;quot; height=&amp;quot;128dp&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.2 The &amp;amp;lt;svg&amp;amp;gt; element ===&lt;br /&gt;
&lt;br /&gt;
Renders an SVG image. Unlike upstream RmlUI, the Recoil implementation accepts either a file path &amp;#039;&amp;#039;&amp;#039;or raw inline SVG data&amp;#039;&amp;#039;&amp;#039; in the &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; attribute:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- External file --&amp;gt;&lt;br /&gt;
&amp;lt;svg src=&amp;quot;images/icon.svg&amp;quot; width=&amp;quot;32dp&amp;quot; height=&amp;quot;32dp&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Inline SVG data --&amp;gt;&lt;br /&gt;
&amp;lt;svg src=&amp;quot;&amp;lt;svg xmlns=&amp;#039;http://www.w3.org/2000/svg&amp;#039; viewBox=&amp;#039;0 0 10 10&amp;#039;&amp;gt;&amp;lt;circle cx=&amp;#039;5&amp;#039; cy=&amp;#039;5&amp;#039; r=&amp;#039;4&amp;#039; fill=&amp;#039;red&amp;#039;/&amp;gt;&amp;lt;/svg&amp;gt;&amp;quot;&lt;br /&gt;
     width=&amp;quot;32dp&amp;quot; height=&amp;quot;32dp&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 9. Debugging ==&lt;br /&gt;
&lt;br /&gt;
RmlUI ships with a DOM debugger that you can open in-game to inspect elements, check computed styles, and view event logs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
-- Enable the debugger for the shared context.&lt;br /&gt;
-- Call this AFTER the context has been created.&lt;br /&gt;
RmlUi.SetDebugContext(&amp;#039;shared&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
-- A handy pattern: toggle via a build flag in rml_setup.lua&lt;br /&gt;
local DEBUG_RMLUI = true   -- set false before shipping&lt;br /&gt;
if DEBUG_RMLUI then&lt;br /&gt;
    RmlUi.SetDebugContext(&amp;#039;shared&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once enabled, a small panel appears in the game window. Click &amp;#039;&amp;#039;&amp;#039;Debug&amp;#039;&amp;#039;&amp;#039; to open the inspector or &amp;#039;&amp;#039;&amp;#039;Log&amp;#039;&amp;#039;&amp;#039; for the event log.&lt;br /&gt;
&lt;br /&gt;
{{Note|The debugger attaches to one context at a time. Using the shared context means you see all widgets in one place — very useful for tracking cross-widget interactions.}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 10. Best Practices ==&lt;br /&gt;
&lt;br /&gt;
; Use dp units everywhere&lt;br /&gt;
: The &amp;lt;code&amp;gt;dp&amp;lt;/code&amp;gt; unit scales with &amp;lt;code&amp;gt;context.dp_ratio&amp;lt;/code&amp;gt;, so your UI automatically adapts to different resolutions and the player&amp;#039;s &amp;lt;code&amp;gt;ui_scale&amp;lt;/code&amp;gt; setting.&lt;br /&gt;
&lt;br /&gt;
; One shared context per game&lt;br /&gt;
: Beyond All Reason and most community projects use a single &amp;lt;code&amp;gt;&amp;#039;shared&amp;#039;&amp;lt;/code&amp;gt; context. Documents in the same context can reference the same data models and are Z-ordered relative to each other.&lt;br /&gt;
&lt;br /&gt;
; Keep data models flat when possible&lt;br /&gt;
: Top-level writes via &amp;lt;code&amp;gt;dm_handle.key = value&amp;lt;/code&amp;gt; are automatically dirty-marked. Deeply nested structures require manual &amp;lt;code&amp;gt;__SetDirty&amp;lt;/code&amp;gt; calls — simpler models mean fewer bugs.&lt;br /&gt;
&lt;br /&gt;
; Separate per-document and shared styles&lt;br /&gt;
: Put styles unique to one document in a &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;style&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; block inside the &amp;lt;code&amp;gt;.rml&amp;lt;/code&amp;gt; file. Put styles shared across multiple documents in a &amp;lt;code&amp;gt;.rcss&amp;lt;/code&amp;gt; file and link it.&lt;br /&gt;
&lt;br /&gt;
; Guard against missing RmlUi&lt;br /&gt;
: Always start widgets with &amp;lt;code&amp;gt;if not RmlUi then return end&amp;lt;/code&amp;gt; to prevent errors in environments where RmlUI is unavailable.&lt;br /&gt;
&lt;br /&gt;
; Check return values&lt;br /&gt;
: Both &amp;lt;code&amp;gt;OpenDataModel&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;LoadDocument&amp;lt;/code&amp;gt; can fail silently if paths are wrong. Always check for nil and log an error so you know immediately what happened.&lt;br /&gt;
&lt;br /&gt;
; Organise by widget folder&lt;br /&gt;
: Group &amp;lt;code&amp;gt;luaui/widgets/my_widget/my_widget.lua&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.rml&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;.rcss&amp;lt;/code&amp;gt; together. This makes the project navigable and each widget self-contained.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 11. RCSS Gotchas ==&lt;br /&gt;
&lt;br /&gt;
RCSS closely follows CSS2 but has several important differences that will trip up web developers:&lt;br /&gt;
&lt;br /&gt;
; No default stylesheet&lt;br /&gt;
: RmlUI ships with zero default styles. Block/inline, heading sizes, list bullets — none of it exists unless you add it. Copy the HTML4 base sheet from the RmlUI docs as a starting point.&lt;br /&gt;
&lt;br /&gt;
; RGBA alpha is 0–255&lt;br /&gt;
: &amp;lt;code&amp;gt;rgba(255, 0, 0, 128)&amp;lt;/code&amp;gt; means 50% transparent red. CSS uses 0.0–1.0 for alpha. The &amp;lt;code&amp;gt;opacity&amp;lt;/code&amp;gt; property still uses 0.0–1.0.&lt;br /&gt;
&lt;br /&gt;
; Border shorthand has no style keyword&lt;br /&gt;
: &amp;lt;code&amp;gt;border: 1dp #6c7086;&amp;lt;/code&amp;gt; works. &amp;lt;code&amp;gt;border: 1dp solid #6c7086;&amp;lt;/code&amp;gt; does &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; work. Only solid borders are supported; &amp;lt;code&amp;gt;border-style&amp;lt;/code&amp;gt; is unavailable.&lt;br /&gt;
&lt;br /&gt;
; background-* properties use decorators&lt;br /&gt;
: &amp;lt;code&amp;gt;background-color&amp;lt;/code&amp;gt; works normally. &amp;lt;code&amp;gt;background-image&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;background-size&amp;lt;/code&amp;gt;, etc. are replaced by the decorator system. See the RmlUI docs for syntax.&lt;br /&gt;
&lt;br /&gt;
; No list styling&lt;br /&gt;
: &amp;lt;code&amp;gt;list-style-type&amp;lt;/code&amp;gt; and friends are not supported. &amp;lt;code&amp;gt;ul&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;ol&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;li&amp;lt;/code&amp;gt; have no special rendering — treat them as plain div-like elements.&lt;br /&gt;
&lt;br /&gt;
; Input text is set by content, not value&lt;br /&gt;
: For &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;input type=&amp;quot;button&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;input type=&amp;quot;submit&amp;quot;&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; the displayed text comes from the element&amp;#039;s text content, not the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; attribute (unlike HTML).&lt;br /&gt;
&lt;br /&gt;
; pointer-events: auto required&lt;br /&gt;
: By default elements do not receive mouse events. Add &amp;lt;code&amp;gt;pointer-events: auto&amp;lt;/code&amp;gt; to any element that needs to be interactive.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 12. Differences from Upstream RmlUI ==&lt;br /&gt;
&lt;br /&gt;
The Recoil implementation is based on the official RmlUI library but adds engine-specific features and changes some defaults:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Feature !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;&amp;lt;texture&amp;gt;&amp;lt;/nowiki&amp;gt; element&amp;#039;&amp;#039;&amp;#039; || A custom element that renders engine-managed textures via Recoil texture reference strings. Not present in upstream.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;&amp;lt;svg&amp;gt;&amp;lt;/nowiki&amp;gt; inline data&amp;#039;&amp;#039;&amp;#039; || The &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; attribute accepts raw SVG markup in addition to file paths. Upstream only supports file paths.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;VFS file loader&amp;#039;&amp;#039;&amp;#039; || All file paths are resolved through Recoil&amp;#039;s Virtual File System, so &amp;lt;code&amp;gt;.rml&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.rcss&amp;lt;/code&amp;gt; files work inside &amp;lt;code&amp;gt;.sdz&amp;lt;/code&amp;gt; game archives transparently.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Lua bindings via sol2&amp;#039;&amp;#039;&amp;#039; || The Lua API is provided by RmlSolLua (derived from [https://github.com/LoneBoco/RmlSolLua LoneBoco/RmlSolLua]) rather than the upstream Lua plugin, offering tighter engine integration.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;dp_ratio via context&amp;#039;&amp;#039;&amp;#039; || &amp;lt;code&amp;gt;context.dp_ratio&amp;lt;/code&amp;gt; is set from code rather than the system DPI, allowing games to honour the player&amp;#039;s &amp;lt;code&amp;gt;ui_scale&amp;lt;/code&amp;gt; preference.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|For everything not listed above, the upstream RmlUI documentation at [https://mikke89.github.io/RmlUiDoc/ mikke89.github.io/RmlUiDoc] applies directly.}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 13. IDE Setup ==&lt;br /&gt;
&lt;br /&gt;
Configuring your editor for &amp;lt;code&amp;gt;.rml&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;.rcss&amp;lt;/code&amp;gt; file extensions dramatically improves the authoring experience.&lt;br /&gt;
&lt;br /&gt;
=== VS Code ===&lt;br /&gt;
&lt;br /&gt;
# Open any &amp;lt;code&amp;gt;.rml&amp;lt;/code&amp;gt; file in VS Code.&lt;br /&gt;
# Click the language mode indicator in the status bar (usually shows &amp;#039;&amp;#039;Plain Text&amp;#039;&amp;#039;).&lt;br /&gt;
# Choose &amp;#039;&amp;#039;&amp;#039;Configure File Association for &amp;#039;.rml&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# Select &amp;#039;&amp;#039;&amp;#039;HTML&amp;#039;&amp;#039;&amp;#039; from the list.&lt;br /&gt;
# Repeat for &amp;lt;code&amp;gt;.rcss&amp;lt;/code&amp;gt; files, selecting &amp;#039;&amp;#039;&amp;#039;CSS&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Lua Language Server (lua-ls) ===&lt;br /&gt;
&lt;br /&gt;
Add the Recoil type annotations to your workspace for autocomplete on &amp;lt;code&amp;gt;RmlUi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Spring&amp;lt;/code&amp;gt;, and all widget APIs. See the Recoil docs guide on the Lua Language Server for details.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== 14. Quick Reference ==&lt;br /&gt;
&lt;br /&gt;
=== Lua API ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Call !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RmlUi.CreateContext(name)&amp;lt;/code&amp;gt; || Create a new rendering context&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RmlUi.GetContext(name)&amp;lt;/code&amp;gt; || Retrieve an existing context by name&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RmlUi.LoadFontFace(path, fallback)&amp;lt;/code&amp;gt; || Register a &amp;lt;code&amp;gt;.ttf&amp;lt;/code&amp;gt; font (&amp;lt;code&amp;gt;fallback=true&amp;lt;/code&amp;gt; recommended)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RmlUi.SetMouseCursorAlias(css, engine)&amp;lt;/code&amp;gt; || Map a CSS cursor name to an engine cursor name&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RmlUi.SetDebugContext(name)&amp;lt;/code&amp;gt; || Attach the DOM debugger to a named context&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ctx:OpenDataModel(name, tbl)&amp;lt;/code&amp;gt; || Create reactive data model from Lua table; &amp;#039;&amp;#039;&amp;#039;store the return value!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ctx:RemoveDataModel(name)&amp;lt;/code&amp;gt; || Destroy a data model and free its memory&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ctx:LoadDocument(path, scope)&amp;lt;/code&amp;gt; || Parse an RML file; scope is used for normal (&amp;lt;code&amp;gt;on*&amp;lt;/code&amp;gt;) events&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;doc:Show()&amp;lt;/code&amp;gt; || Make the document visible&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;doc:Hide()&amp;lt;/code&amp;gt; || Hide the document (keeps it in memory)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;doc:Close()&amp;lt;/code&amp;gt; || Destroy the document&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;doc:ReloadStyleSheet()&amp;lt;/code&amp;gt; || Reload linked &amp;lt;code&amp;gt;.rcss&amp;lt;/code&amp;gt; files (useful during development)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dm:__GetTable()&amp;lt;/code&amp;gt; || Get the underlying Lua table for iteration&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dm:__SetDirty(key)&amp;lt;/code&amp;gt; || Mark a top-level model key as changed; triggers re-render&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;dm.key = value&amp;lt;/code&amp;gt; || Write a top-level value; auto-marks dirty&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Useful Links ===&lt;br /&gt;
&lt;br /&gt;
* [https://mikke89.github.io/RmlUiDoc/ RmlUI official documentation]&lt;br /&gt;
* [https://mikke89.github.io/RmlUiDoc/pages/data_bindings/views_and_controllers.html RmlUI data bindings reference]&lt;br /&gt;
* [https://mikke89.github.io/RmlUiDoc/pages/rcss.html RmlUI RCSS reference]&lt;br /&gt;
* [https://mikke89.github.io/RmlUiDoc/pages/rml/html4_style_sheet.html RmlUI HTML4 base stylesheet]&lt;br /&gt;
* [https://mikke89.github.io/RmlUiDoc/pages/rcss/decorators.html RmlUI decorators (backgrounds)]&lt;br /&gt;
* [https://github.com/mikke89/RmlUi RmlUI GitHub]&lt;br /&gt;
* [https://github.com/beyond-all-reason/RecoilEngine/tree/master/rts/Rml RecoilEngine source (rts/Rml/)]&lt;br /&gt;
* Recoil texture reference strings — see engine docs: &amp;lt;code&amp;gt;articles/texture-reference-strings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Guides]]&lt;br /&gt;
[[Category:LuaUI]]&lt;br /&gt;
[[Category:RmlUI]]&lt;/div&gt;</summary>
		<author><name>Qrow</name></author>
	</entry>
</feed>