Use this file to discover all available pages before exploring further.
Prowl.Paper handles text display and text input as first-class element capabilities. Static content is set directly on an element with Text, RichText, or Markdown; interactive editing is added with TextField or TextArea. All text styling properties (FontSize, TextColor, etc.) are inherited from StyleSetterBase<T> and interact correctly with state blocks and style templates.
Parses the text as Markdown and renders inline formatting. Block-level Markdown elements (headings, lists, code fences) are supported where the underlying Scribe renderer implements them.
Renders tagged rich text. The laid-out result is cached across frames so that animation timers (typewriter reveal, wave, pulse) survive between frames. Call Paper.ResetRichText on the element’s handle to replay animations from the beginning.Supported inline tags:
Creates a single-line editable text control. The element that calls TextField becomes the input container — apply sizing, background, border, and padding to it as normal.Overload 1 — full settings:
Current text value. The field reads this every frame when unfocused; while focused, internal state is authoritative (see TextInputSettings.ForceValue to override).
Use the simple overload for quick prototyping; switch to the settings overload for production controls that need masking, filtering, or SelectAllOnFocus.
string name = "";Paper.Element("name-field") .Size(UnitValue.Pixels(240), UnitValue.Pixels(32)) .BackgroundColor(darkBg) .Rounded(4f) .Padding(UnitValue.Pixels(6)) .TextField(name, uiFont, onChange: v => name = v, placeholder: "Enter name…");
TextArea automatically enables ContentSizer for the inner text content so the element’s height grows with its content when unconstrained. Give the element a fixed height and call Clip() to produce a scrollable box.
TextInputSettings is a plain value struct. All fields have defaults provided by the static Default property.
var settings = TextInputSettings.Default;
Field
Type
Default
Description
Font
FontFile
null
Font used to render and measure text inside the field.
TextColor
Color
Near-white
Color of input text.
Placeholder
string
""
Hint text shown when the field is empty and unfocused.
PlaceholderColor
Color
Muted grey
Color of placeholder text.
ReadOnly
bool
false
When true, the field displays text but rejects all edits.
MaxLength
int
0
Maximum character count. 0 means no limit.
DoWrap
bool
true
Multi-line only — true to wrap lines at the field width; false to scroll horizontally.
CharFilter
Func<char, string, bool>
null
Return true to accept a character, false to reject it. Receives the incoming character and the current full value.
SelectAllOnFocus
bool
false
Selects all text when the field gains focus.
MaskChar
char?
null
When set, every visible character is replaced with this glyph for display. The underlying value is unchanged. Clipboard copy/cut is suppressed while masking.
ForceValue
string
null
When non-null, overrides the internal value for the current frame regardless of focus state. Reset to null on subsequent frames.
ForceSelectAll
bool
false
Companion to ForceValue: selects all text after a forced update, if the field is focused.
Clipboard copy and cut (Ctrl+C / Ctrl+X) are automatically suppressed when MaskChar is set, so masked content cannot leave the field via the clipboard.
When you need to push a new value into a focused field from outside (e.g. an autocomplete suggestion), set ForceValue for exactly one frame:
string query = "";bool applyAutocomplete = false;string autocompleteResult = "";var searchSettings = TextInputSettings.Default;searchSettings.Font = uiFont;searchSettings.Placeholder = "Search…";searchSettings.SelectAllOnFocus = true;if (applyAutocomplete){ searchSettings.ForceValue = autocompleteResult; searchSettings.ForceSelectAll = false; // place cursor at end, don't select applyAutocomplete = false; // clear flag — only force for one frame}Paper.Element("search-field") .Size(UnitValue.Pixels(300), UnitValue.Pixels(32)) .BackgroundColor(darkBg) .Rounded(4f) .Padding(UnitValue.Pixels(6)) .TextField(query, searchSettings, v => query = v);
Set ForceValue only on the frame you want to apply the change. On subsequent frames, leave it as null; otherwise the field’s internal editing state is replaced every frame, breaking normal typing.