feat: buffer terminal input sequences

- add stdin buffer for escape sequences and bracketed paste

- parse control keys and CSI modifier combinations

- simplify example to focus on interactive components
This commit is contained in:
chuan
2026-06-04 00:37:20 +08:00
parent 02ef36eff5
commit 2ab090d724
4 changed files with 362 additions and 70 deletions
+5 -21
View File
@@ -19,18 +19,9 @@ var done = new ManualResetEventSlim();
var eventsText = new Text("最近事件:\n- 无");
var statusText = new Text();
var loader = new Loader(textMeasurer) { Message = "运行中" };
var selectPreview = new SelectList(textMeasurer) { Height = 4 };
var markdownPreview = new Markdown(
"# Markdown 预览\n" +
"## 二级标题会转成大写\n" +
"- 列表项会转成星号前缀\n" +
"> 引用会转成竖线前缀\n" +
"支持 **粗体标记清理** 和 `行内代码标记清理`");
using var loaderCancellation = new CancellationTokenSource();
var input = new TinyTUI.Components.Input(textMeasurer) { Prompt = "请输入: " };
selectPreview.SetItems(["Text", "Input", "Editor", "SelectList", "Markdown", "Loader", "Overlay"]);
input.OnChanged = value => UpdateStatus(statusText, value, textMeasurer, renderer);
input.OnSubmitted = value =>
{
@@ -67,9 +58,8 @@ AddAll(
page,
new Text("TinyTUI 基础组件示例"),
new Text("======================"),
new Markdown(
"# 操作说明\n" +
"- Markdown Loader SelectList 预览会在页面启动时直接显示\n" +
new Text(
"操作说明\n" +
"- 输入文本后 Enter 提交\n" +
"- /help 打开帮助弹层\n" +
"- /select 打开可交互选择列表\n" +
@@ -78,13 +68,7 @@ AddAll(
new Text(),
new Box(statusText, textMeasurer) { Title = "状态" },
new Text(),
new Box(markdownPreview, textMeasurer) { Title = "Markdown 预览" },
new Text(),
new Box(loader, textMeasurer) { Title = "Loader" },
new Text(),
new Box(selectPreview, textMeasurer) { Title = "SelectList 预览" },
new Text(),
new Box(input, textMeasurer) { Title = "Input" },
new Box(new Container { Children = { loader, input } }, textMeasurer) { Title = "Input" },
new Text(),
new Box(eventsText, textMeasurer) { Title = "事件" });
@@ -160,8 +144,8 @@ static void AddAll(Container container, params IComponent[] components)
file sealed class HelpOverlay(ITuiRuntime runtime, ITextMeasurer textMeasurer) : IInputComponent
{
private readonly Box _box = new(
new Markdown(
"# Overlay 示例\n" +
new Text(
"Overlay 示例\n" +
"\n" +
"- 这个弹层由 Runtime 显示\n" +
"- OverlayManager 会把它合成到基础页面上\n" +