# HTML Compatibility Layer
eepp includes an HTML/CSS compatibility layer for rendering document-like content inside the UI
system.
This layer is used primarily by:
- `UIWebView`;
- `UIMarkdownView`;
- HTML-derived widgets such as `UIRichText`, `UITextSpan`, HTML tables, forms, images, and inputs.
It is intentionally distinct from normal eepp application UI authoring.
For ordinary application UI, use native eepp layouts such as `vbox`, `hbox`,
`UIRelativeLayout`, `UIGridLayout`, `UIFlowLayout`, `UISplitter`, and `UITabWidget`.
See [`ui_authoring.md`](ui_authoring.md),
[`ui_layout_reference.md`](ui_layout_reference.md), and
[`ui_css_for_applications.md`](ui_css_for_applications.md).
This document describes the **HTML compatibility model**, the browser-style layout concepts it
implements, and the important places where it differs from a full browser engine.
---
## 1. The most important boundary
eepp has two related but different layout worlds.
### Native application UI
Normal eepp application interfaces use:
```text
UILinearLayout / vbox / hbox
UIRelativeLayout
UIGridLayout
UIFlowLayout
UISplitter
UITabWidget
UIScrollView
layout-width
layout-height
layout-weight
layout-gravity
```
CSS can configure those widgets, but CSS does not replace their native layout algorithms.
### HTML compatibility UI
HTML-derived widgets can instead participate in browser-style formatting contexts:
```text
block
inline
inline-block
list-item
flex
inline-flex
grid
inline-grid
table
float / clear
absolute / fixed / sticky positioning
```
The same CSS parser and property system are shared by both worlds, but the **layout semantics depend
on the widget type and formatting context**.
Do not use browser layout properties merely because the stylesheet parser accepts them.
---
## 2. `UIWebView` is the full document host
`UIWebView` is the main host for HTML documents.
It is implemented as a `UIScrollView` containing an embedded `UISceneNode` dedicated to the loaded
document.
Conceptually:
```text
UIWebView
scroll viewport
embedded UISceneNode
document container
html
head
body
```
The embedded scene gives the document its own:
- widget tree;
- stylesheet state;
- document URI;
- resource loading context;
- font-face registrations;
- navigation handling;
- text-selection context.
Use:
```cpp
auto* webView = UIWebView::New();
webView->loadURI( URI( "file:///path/document.html" ) );
```
or an HTTP/HTTPS URI.
`UIWebView` supports navigation history through:
```cpp
goHistoryBack();
goHistoryForward();
refresh();
reload();
canGoBack();
canGoForward();
```
It also exposes navigation events for started, completed, and failed loads.
---
## 3. `UIMarkdownView` uses the HTML compatibility layer too
`UIMarkdownView` converts Markdown to XHTML and then loads the resulting body children as eepp HTML
widgets.
Its pipeline is approximately:
```text
Markdown
-> Markdown::toXHTML()
-> HTMLFormatter::HTMLBodyToXML()
-> eepp HTML widgets
```
Unlike `UIWebView`, `UIMarkdownView` is not a standalone browsing context with document navigation
and a dedicated embedded scene.
It is a native vertical layout hosting HTML-derived content and loads the **basic HTML default
styles** needed for Markdown rendering.
Use `UIMarkdownView` for rendered Markdown content, not as a general browser replacement.
---
## 4. HTML is parsed before eepp widgets are created
`UIWebView` does not feed arbitrary HTML directly into the normal XML layout parser.
HTML is first parsed with Gumbo, then serialized into strict XML through
`Tools::HTMLFormatter`.
This stage handles browser-style HTML parsing details such as:
- malformed/non-XML HTML syntax;
- omitted closing syntax where HTML permits it;
- HTML void elements;
- boolean attributes;
- normalized tag names.
The resulting strict XML is then loaded through eepp's widget creation system.
This architecture is important:
```text
HTML source
-> Gumbo HTML tree
-> strict XML representation
-> UIWidgetCreator
-> eepp widget tree
```
The final rendered document is therefore still made of eepp widgets.
---
## 5. Only registered HTML elements are materialized
HTML compatibility is not based on a generic DOM element class that accepts every possible tag.
HTML tags are mapped through `UIWidgetCreator`.
Currently registered HTML elements include the major supported groups:
```text
document:
html
head
body
text and inline:
a
label
span
em
b
strong
small
i
cite
kbd
sub
sup
time
u
ins
s
strike
del
font
code
abbr
tt
mark
blocks:
div
p
blockquote
h1 ... h6
br
hr
pre
lists:
ul
ol
dl
dt
dd
li
semantic containers:
header
article
figure
figcaption
footer
main
section
nav
aside
center
interactive/details:
details
summary
media/replaced content:
picture
img
svg
forms:
form
input
textarea
button
tables:
table
thead
tbody
tfoot
tr
th
td
```
The exact set is defined in:
```text
src/eepp/ui/uiwidgetcreator.cpp
```
An unregistered tag does not automatically become a transparent generic HTML container.
Applications can register additional widget creators if they need custom tags.
---
## 6. This is not a JavaScript browser runtime
`