webui
Programmatic Rust API for the WebUI build-time rendering framework. Parse templates, compile protocols, and render HTML — no CLI required.
Install
Quick Start
use ;
// Build a WebUI application from an app directory
let result = build?;
// result.protocol_bytes — serialized protocol (protobuf binary)
// result.css_files — extracted component CSS files
// result.component_asset_files — root/chunk `.webui.js` assets
// result.metafile — optional esbuild-compatible graph JSON
// result.stats — build timing and fragment counts
API
Build
| Function | Description |
|---|---|
build(options) |
Parse templates, discover components, compile protocol |
build_to_disk(options, out_dir) |
Build and write protocol.bin, CSS, and generated component ESM inputs to disk |
use ;
build_to_disk?;
Unwrapped components default to a generated open Shadow root. Set
dom: DomStrategy::Light to render unwrapped components as authored/global
Light DOM. A sole bare <template> is also an explicit Light wrapper and is
unwrapped; a sole authored <template shadowrootmode="open"> remains Shadow.
Light CSS must use ordinary selectors: :host, :host-context, and ::slotted
are rejected with unsupported-light-css.
For CDN/cache-friendly Link-mode CSS, override the asset output fields:
BuildOptions
To emit lazy static component assets from Rust, set component_asset_roots and
use the WebUI plugin:
BuildOptions
The result contains one stable module per asset-owned component plus a thin
root entry with static imports for its closure. These are application-bundler
inputs: the bundler owns final chunks, hashes, public paths, and caching.
Entry-reachable dependencies remain external prerequisites. Asset-only
component records are removed from protocol.bin. Component assets cannot be
combined with <route>.
LegalComments::Inline is the default and preserves legal CSS comments
containing @license or @preserve, or starting with /*! or //!. Use
LegalComments::None to strip all HTML and CSS comments from build output.
Render
use ;
let protocol = from_protobuf?;
let state: Value = json!;
let handler = new;
handler.render?;
With a hydration plugin enabled (the webui plugin shown here; see the WebUI documentation for the available plugin identifiers):
use ;
use WebUIHydrationPlugin;
let handler = with_plugin;
Progressive Responses
For host-paced <boundary> rendering, drive the four-state session directly:
use ;
let options = new;
let mut response =
handler.stream_response?;
let mut step = response.start?;
while !step.done
| Method | Result |
|---|---|
start(state) |
Shell bytes through the first descriptor or terminal |
resume(instance_id, state, mode) |
Only the pending occurrence through its checkpoint |
advance() |
Following parent bytes through the next descriptor or terminal |
update(instance_id, patch) |
Projected state for an updatable occurrence |
A descriptor means call resume; no descriptor with done == false means call
advance; done == true means complete. Boundary-only resume makes a
checkpoint independently flushable. advance writes following parent or tail
bytes, so no sibling boundary is needed. An update is valid between resume and
advance.
Inspect
use ;
// From a file
let json = inspect?;
// From bytes
let json = inspect_bytes?;
Partial Responses (Client Navigation)
For servers handling client-side navigation, produce a complete JSON partial:
let partial = protocol.render_partial?;
// Returns: { state, templates, inventory, path, chain }
Serialized host boundaries can call render_partial_json() to validate and
project raw JSON without materializing a duplicate state tree:
let partial = protocol.render_partial_json?;
Types
| Type | Description |
|---|---|
BuildOptions |
Build configuration (app_dir, entry, css, plugin, components, css_file_name_template, css_public_base) |
BuildResult |
Build output (protocol, css_files, component_templates with metadata/closures, stats) |
BuildStats |
Build metrics (duration, fragment_count, protocol_size_bytes) |
Protocol |
Loaded immutable runtime protocol with reusable indices |
WebUIHandler |
Rendering engine (stateless, thread-safe) |
RenderOptions |
Render configuration (entry_id, request_path) |
ResponseWriter |
Trait for streaming rendered output |
CssStrategy |
CSS delivery mode (Link, Style, or Module) |
WebUIError |
Error type for build/inspect operations |
License
MIT