Default IFolderBrowser backed by System.IO. Exception-safe:
unauthorized, missing, or transiently failing locations surface as empty listings rather
than thrown exceptions. Platform behavior follows the host OS by default and can be
overridden for testing.
Rich activity dialog control: a live CliGrid-backed layout (columns, rows, text and
progress-bar elements) driven by named dynamic row values, plus a background operation and a single
stop button (Cancel or Abort — never both). The operation runs on a background task and reports
values through an ActivityContext; updates are applied on the modal-loop thread in
AdvanceState(DateTime). Completion, failure and a confirmed stop all close the dialog without a
keypress through CompletionResult.
Optional, reusable confirmation policy for an InlineDialog. When a confirmable
key-produced result (Cancel or Abort)
is requested and this policy includes that kind, the dialog enters an internal confirmation mode
(a Yes/No message box) before completing. Choosing Yes completes with the originally
requested kind; No (or Escape) dismisses the confirmation and resumes the original dialog.
Loop-/externally-produced kinds (TokenCancel, Timeout, SystemCancel) are never confirmed.
A message-box style inline control: a block of message text plus a row of buttons. It is the first
consumer of the multi-widget dialog layout — it exposes exactly two top-level widgets, the message
content (InFrameScrollable) and the button group
(InFrame), and routes keys to the (focused) button group.
Dialog-hostable single-selection control over structured, multi-column rows. It wraps an
InlineMultiColumnSelectWidget and behaves like InlineSelect — keyboard
navigation, Enter confirms the highlighted row (payload = its index), Escape cancels — but each row is
laid out across several aligned columns instead of a single preformatted line.
A TuiTicker that cycles through a fixed sequence of string frames, wrapping back to the
first frame after the last. Suitable for a loading spinner or any small cyclic indicator. Frames come
either from a predefined SpinnerFrameSet (the default being a four-step braille spinner)
or from a caller-supplied custom sequence. Generic by design — it owns frames and timing only and
carries no knowledge of any particular control. The frame strings are raw content: any presentation
(brackets, styling, title prefixing) is decided by the overlay or title that renders them.