# 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 `