1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//! TUI(终端用户界面)实用工具模块
//!
//! 本模块提供了用于终端用户界面的辅助工具函数,主要支持 CLI 交互式界面的渲染和显示。
//!
//! # 主要功能
//!
//! - **光标位置计算**:根据文本内容和光标索引计算光标在多行文本中的行列位置
//! - **视觉效果生成**:提供霓虹呼吸效果的颜色循环,用于动态视觉反馈
//!
//! # 使用场景
//!
//! 这些工具函数主要用于增强 TUI 界面的用户体验,例如:
//! - 在交互式输入框中正确定位光标
//! - 为状态指示器提供动态颜色效果
use Color;
use UnicodeWidthChar;
/// 根据文本内容和光标索引计算光标的行列位置
///
/// 此函数遍历输入文本的前 `cursor_idx` 个字符,计算光标在多行文本中的
/// 逻辑位置(行号和列号)。支持 Unicode 字符的正确宽度计算。
///
/// # 参数
///
/// - `input`:输入的文本内容
/// - `cursor_idx`:光标在文本中的字符索引位置(基于字符,而非字节)
///
/// # 返回值
///
/// 返回一个元组 `(row, col)`:
/// - `row`:光标所在的行号(从 0 开始)
/// - `col`:光标所在的列号(从 0 开始,考虑 Unicode 字符宽度)
///
/// # 示例
///
/// ```ignore
/// let text = "Hello\nWorld";
/// let pos = cursor_position(text, 7); // 指向 'W'
/// assert_eq!(pos, (1, 0)); // 第 2 行,第 0 列
/// ```
///
/// # 注意事项
///
/// - 换行符 `\n` 会将列号重置为 0,并将行号加 1
/// - 使用 `unicode_width` 计算字符的显示宽度,正确处理中文等宽字符
/// - 使用饱和运算避免溢出
pub
/// 根据呼吸动画的阶段返回对应的霓虹色
///
/// 此函数实现了一个循环的霓虹呼吸效果,通过预定义的颜色调色板
/// 产生平滑的颜色过渡,用于创建动态视觉反馈效果。
///
/// # 参数
///
/// - `phase`:呼吸动画的当前阶段索引(通常随时间递增)
///
/// # 返回值
///
/// 返回调色板中对应阶段的 `Color` 值
///
/// # 颜色循环
///
/// 调色板包含 8 种颜色,从深蓝到青色再回到深蓝:
/// 1. 深蓝色 (0, 170, 220)
/// 2. 亮蓝色 (0, 200, 240)
/// 3. 浅蓝色 (20, 230, 255)
/// 4. 青色 (60, 255, 245) - 最亮点
/// 5. 浅蓝色 (20, 230, 255)
/// 6. 亮蓝色 (0, 200, 240)
/// 7. 深蓝色 (0, 170, 220)
/// 8. 暗蓝色 (0, 145, 205) - 最暗点
///
/// # 示例
///
/// ```ignore
/// for phase in 0..16 {
/// let color = neon_breath_color(phase);
/// // 颜色会在调色板中循环
/// }
/// ```
///
/// # 使用场景
///
/// 常用于:
/// - 状态指示器的动态颜色
/// - 加载动画的视觉效果
/// - 用户交互反馈
pub