Skip to main content
Every Prefab UI is wrapped in a PrefabApp. It holds your component tree, state, theme, and external assets together as a single unit.

Creating an App

Context manager

The natural way to build an app. Components inside the with block become the view:
The context manager creates an implicit root Column, so children stack vertically. State, theme, and styling are declared upfront — by the time the first component renders, the app envelope is established. The root Column gets a pf-app-root CSS class that themes target for default padding. Add your own classes via css_class:

Passing a view

If you build the tree separately, pass it via view=:

From wire data

PrefabApp.from_json() wraps pre-serialized wire protocol data, for example from sandboxed execution. Keyword arguments override values from the wire:

Fields

Methods

app.html() returns a complete, self-contained HTML page with the Prefab renderer and all data baked in. app.to_json() returns the wire-format envelope — a dict with $prefab, view, state, defs, css, stylesheets, and mode as needed. app.csp() computes Content Security Policy domains from the app’s asset configuration.

State

state sets the initial values that template expressions like {{ count }} resolve against:
Pass state directly to the PrefabApp constructor:

on_mount

Run actions when the app loads. This is the place to start polling intervals, fetch initial data, or perform any setup that depends on the renderer being ready:
on_mount is actually a universal component property — every component supports it, not just PrefabApp. For most components it fires immediately since the entire tree renders at once. But for components inside Condition, Pages, or ForEach, it fires when they actually enter the DOM — useful for lazy data loading when a tab activates or a conditional branch becomes true.

Keyboard Shortcuts

key_bindings maps keyboard shortcuts to actions. When a user presses a matching key combination, the action fires, same as on_click or on_mount. Keys are standard DOM KeyboardEvent.key values, with optional modifier prefixes:
Modifier prefixes are Ctrl+, Shift+, Alt+, and Meta+ (⌘ on Mac). They combine naturally: "Ctrl+Shift+S" matches Ctrl+Shift+S. The key portion uses the standard KeyboardEvent.key names: ArrowRight, ArrowLeft, Enter, Escape, Tab, letter keys, etc. Key bindings are suppressed when the user is typing in an input, textarea, or select, so shortcuts never interfere with form entry.

Keyboard Shortcuts Dialog

The KeyboardShortcutsDialog helper builds a dialog that lists your shortcuts with styled Kbd key indicators. It returns a SetState action you can wire directly into key_bindings:
The dialog binds its open state to a state variable (default _show_shortcuts), so the SetState action from key_bindings opens it programmatically. The trigger button also works for mouse users. No initial state setup is needed; the dialog defaults to closed. The helper uses the state-controlled Dialog name prop under the hood.

Stylesheets

Use stylesheets for external CSS URLs. They render as <link> tags and contribute style origins to app.csp(). Use css for inline CSS strings. They render as <style> tags and are included in the wire format so JSON-based renderers can apply them.