cc98-cli 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +4 -2
  3. package/dist/api/client.d.ts +40 -15
  4. package/dist/api/client.d.ts.map +1 -1
  5. package/dist/api/client.js +179 -38
  6. package/dist/api/client.js.map +1 -1
  7. package/dist/api/endpoints.d.ts +14 -0
  8. package/dist/api/endpoints.d.ts.map +1 -1
  9. package/dist/api/endpoints.js +21 -1
  10. package/dist/api/endpoints.js.map +1 -1
  11. package/dist/api/types.d.ts +13 -0
  12. package/dist/api/types.d.ts.map +1 -1
  13. package/dist/api/webvpn.d.ts +68 -0
  14. package/dist/api/webvpn.d.ts.map +1 -0
  15. package/dist/api/webvpn.js +311 -0
  16. package/dist/api/webvpn.js.map +1 -0
  17. package/dist/cli/commands/board.d.ts.map +1 -1
  18. package/dist/cli/commands/board.js +16 -1
  19. package/dist/cli/commands/board.js.map +1 -1
  20. package/dist/cli/commands/forum.js +1 -1
  21. package/dist/cli/commands/forum.js.map +1 -1
  22. package/dist/cli/commands/login.js +1 -1
  23. package/dist/cli/commands/login.js.map +1 -1
  24. package/dist/cli/commands/logout.js +2 -2
  25. package/dist/cli/commands/logout.js.map +1 -1
  26. package/dist/cli/commands/me.d.ts.map +1 -1
  27. package/dist/cli/commands/me.js +18 -3
  28. package/dist/cli/commands/me.js.map +1 -1
  29. package/dist/cli/commands/message.d.ts.map +1 -1
  30. package/dist/cli/commands/message.js +11 -1
  31. package/dist/cli/commands/message.js.map +1 -1
  32. package/dist/cli/commands/notice.js +1 -1
  33. package/dist/cli/commands/notice.js.map +1 -1
  34. package/dist/cli/commands/post.d.ts.map +1 -1
  35. package/dist/cli/commands/post.js +13 -1
  36. package/dist/cli/commands/post.js.map +1 -1
  37. package/dist/cli/commands/search.js +1 -1
  38. package/dist/cli/commands/search.js.map +1 -1
  39. package/dist/cli/commands/topic.d.ts.map +1 -1
  40. package/dist/cli/commands/topic.js +42 -6
  41. package/dist/cli/commands/topic.js.map +1 -1
  42. package/dist/cli/commands/user.d.ts.map +1 -1
  43. package/dist/cli/commands/user.js +13 -1
  44. package/dist/cli/commands/user.js.map +1 -1
  45. package/dist/cli/commands/vpn.d.ts +2 -0
  46. package/dist/cli/commands/vpn.d.ts.map +1 -0
  47. package/dist/cli/commands/vpn.js +200 -0
  48. package/dist/cli/commands/vpn.js.map +1 -0
  49. package/dist/cli/context.d.ts +2 -2
  50. package/dist/cli/context.d.ts.map +1 -1
  51. package/dist/cli/context.js +20 -2
  52. package/dist/cli/context.js.map +1 -1
  53. package/dist/cli/router.d.ts.map +1 -1
  54. package/dist/cli/router.js +13 -2
  55. package/dist/cli/router.js.map +1 -1
  56. package/dist/main.js +0 -0
  57. package/dist/storage/image-cache.d.ts +32 -0
  58. package/dist/storage/image-cache.d.ts.map +1 -0
  59. package/dist/storage/image-cache.js +90 -0
  60. package/dist/storage/image-cache.js.map +1 -0
  61. package/dist/storage/vpn-store.d.ts +39 -0
  62. package/dist/storage/vpn-store.d.ts.map +1 -0
  63. package/dist/storage/vpn-store.js +94 -0
  64. package/dist/storage/vpn-store.js.map +1 -0
  65. package/dist/tui/app.d.ts.map +1 -1
  66. package/dist/tui/app.js +27 -1725
  67. package/dist/tui/app.js.map +1 -1
  68. package/dist/tui/borders.d.ts +183 -0
  69. package/dist/tui/borders.d.ts.map +1 -0
  70. package/dist/tui/borders.js +143 -0
  71. package/dist/tui/borders.js.map +1 -0
  72. package/dist/tui/cached-client.d.ts +23 -0
  73. package/dist/tui/cached-client.d.ts.map +1 -1
  74. package/dist/tui/cached-client.js +88 -0
  75. package/dist/tui/cached-client.js.map +1 -1
  76. package/dist/tui/components/content.d.ts +11 -0
  77. package/dist/tui/components/content.d.ts.map +1 -0
  78. package/dist/tui/components/content.js +129 -0
  79. package/dist/tui/components/content.js.map +1 -0
  80. package/dist/tui/components/header.d.ts +7 -0
  81. package/dist/tui/components/header.d.ts.map +1 -0
  82. package/dist/tui/components/header.js +38 -0
  83. package/dist/tui/components/header.js.map +1 -0
  84. package/dist/tui/components/index.d.ts +8 -0
  85. package/dist/tui/components/index.d.ts.map +1 -0
  86. package/dist/tui/components/index.js +9 -0
  87. package/dist/tui/components/index.js.map +1 -0
  88. package/dist/tui/components/layout.d.ts +3 -0
  89. package/dist/tui/components/layout.d.ts.map +1 -0
  90. package/dist/tui/components/layout.js +453 -0
  91. package/dist/tui/components/layout.js.map +1 -0
  92. package/dist/tui/components/overview.d.ts +7 -0
  93. package/dist/tui/components/overview.d.ts.map +1 -0
  94. package/dist/tui/components/overview.js +30 -0
  95. package/dist/tui/components/overview.js.map +1 -0
  96. package/dist/tui/components/sidebar.d.ts +7 -0
  97. package/dist/tui/components/sidebar.d.ts.map +1 -0
  98. package/dist/tui/components/sidebar.js +57 -0
  99. package/dist/tui/components/sidebar.js.map +1 -0
  100. package/dist/tui/components/status.d.ts +8 -0
  101. package/dist/tui/components/status.d.ts.map +1 -0
  102. package/dist/tui/components/status.js +42 -0
  103. package/dist/tui/components/status.js.map +1 -0
  104. package/dist/tui/components/types.d.ts +17 -0
  105. package/dist/tui/components/types.d.ts.map +1 -0
  106. package/dist/tui/components/types.js +3 -0
  107. package/dist/tui/components/types.js.map +1 -0
  108. package/dist/tui/components/utils.d.ts +5 -0
  109. package/dist/tui/components/utils.d.ts.map +1 -0
  110. package/dist/tui/components/utils.js +68 -0
  111. package/dist/tui/components/utils.js.map +1 -0
  112. package/dist/tui/controller.d.ts +66 -0
  113. package/dist/tui/controller.d.ts.map +1 -0
  114. package/dist/tui/controller.js +1200 -0
  115. package/dist/tui/controller.js.map +1 -0
  116. package/dist/tui/helpers.d.ts +25 -0
  117. package/dist/tui/helpers.d.ts.map +1 -0
  118. package/dist/tui/helpers.js +249 -0
  119. package/dist/tui/helpers.js.map +1 -0
  120. package/dist/tui/navigation.d.ts +4 -0
  121. package/dist/tui/navigation.d.ts.map +1 -0
  122. package/dist/tui/navigation.js +19 -0
  123. package/dist/tui/navigation.js.map +1 -0
  124. package/dist/tui/renderer.d.ts +6 -0
  125. package/dist/tui/renderer.d.ts.map +1 -0
  126. package/dist/tui/renderer.js +305 -0
  127. package/dist/tui/renderer.js.map +1 -0
  128. package/dist/tui/state/index.d.ts +3 -0
  129. package/dist/tui/state/index.d.ts.map +1 -0
  130. package/dist/tui/state/index.js +4 -0
  131. package/dist/tui/state/index.js.map +1 -0
  132. package/dist/tui/state/store.d.ts +4 -0
  133. package/dist/tui/state/store.d.ts.map +1 -0
  134. package/dist/tui/state/store.js +62 -0
  135. package/dist/tui/state/store.js.map +1 -0
  136. package/dist/tui/state/types.d.ts +141 -0
  137. package/dist/tui/state/types.d.ts.map +1 -0
  138. package/dist/tui/state/types.js +3 -0
  139. package/dist/tui/state/types.js.map +1 -0
  140. package/dist/tui/topic-reader.d.ts +10 -0
  141. package/dist/tui/topic-reader.d.ts.map +1 -0
  142. package/dist/tui/topic-reader.js +178 -0
  143. package/dist/tui/topic-reader.js.map +1 -0
  144. package/dist/tui/ubb-renderer.d.ts.map +1 -1
  145. package/dist/tui/ubb-renderer.js +176 -12
  146. package/dist/tui/ubb-renderer.js.map +1 -1
  147. package/dist/version.d.ts +1 -1
  148. package/dist/version.js +1 -1
  149. package/package.json +2 -2
  150. /package/{docs/images → images}/tui.jpg +0 -0
@@ -0,0 +1,453 @@
1
+ // 布局组件 - 使用正确的 Unicode 框绘制
2
+ import { ansi, bg, fg } from "../ansi.js";
3
+ import { fit, cellWidth } from "./utils.js";
4
+ import { BOX_ROUNDED } from "../borders.js";
5
+ import { navItems } from "../navigation.js";
6
+ // 颜色常量
7
+ const cc98Blue = fg(0, 130, 202);
8
+ const cc98BlueSoft = fg(94, 180, 232);
9
+ const cc98BlueBg = bg(0, 104, 176);
10
+ const white = fg(245, 250, 255);
11
+ const muted = fg(139, 152, 166);
12
+ const line = fg(52, 84, 112);
13
+ const danger = fg(245, 101, 101);
14
+ const ok = fg(91, 207, 140);
15
+ // 使用圆角框样式
16
+ const style = BOX_ROUNDED;
17
+ // 绘制完整的三栏布局
18
+ export function drawThreeColumnLayout(state, width, height, sidebarWidth, rightWidth) {
19
+ const lines = [];
20
+ const mainWidth = width - sidebarWidth - rightWidth - 2;
21
+ const overviewHeight = 1;
22
+ const bodyHeight = height - 4 - overviewHeight;
23
+ // 1. 顶部标题栏
24
+ lines.push(drawHeader(state, width));
25
+ // 2. 顶部连接线
26
+ if (rightWidth > 0) {
27
+ lines.push(line +
28
+ style.topLeft +
29
+ style.horizontal.repeat(sidebarWidth - 2) +
30
+ style.teeDown +
31
+ style.horizontal.repeat(mainWidth - 2) +
32
+ style.teeDown +
33
+ style.horizontal.repeat(rightWidth - 2) +
34
+ style.topRight +
35
+ ansi.reset);
36
+ }
37
+ else {
38
+ lines.push(line +
39
+ style.topLeft +
40
+ style.horizontal.repeat(sidebarWidth - 2) +
41
+ style.teeDown +
42
+ style.horizontal.repeat(mainWidth - 2) +
43
+ style.topRight +
44
+ ansi.reset);
45
+ }
46
+ // 3. 概览区
47
+ lines.push(...drawOverview(state, width, overviewHeight));
48
+ // 4. 分隔线
49
+ if (rightWidth > 0) {
50
+ lines.push(line +
51
+ style.teeRight +
52
+ style.horizontal.repeat(sidebarWidth - 2) +
53
+ style.cross +
54
+ style.horizontal.repeat(mainWidth - 2) +
55
+ style.cross +
56
+ style.horizontal.repeat(rightWidth - 2) +
57
+ style.teeLeft +
58
+ ansi.reset);
59
+ }
60
+ else {
61
+ lines.push(line +
62
+ style.teeRight +
63
+ style.horizontal.repeat(sidebarWidth - 2) +
64
+ style.cross +
65
+ style.horizontal.repeat(mainWidth - 2) +
66
+ style.teeLeft +
67
+ ansi.reset);
68
+ }
69
+ // 5. 主内容区
70
+ const sidebarLines = drawSidebar(state, sidebarWidth, bodyHeight);
71
+ const mainLines = drawMainContent(state, mainWidth, bodyHeight);
72
+ const rightLines = rightWidth > 0 ? drawRightPanel(state, rightWidth, bodyHeight) : [];
73
+ for (let row = 0; row < bodyHeight; row++) {
74
+ const parts = [
75
+ line + style.vertical + ansi.reset,
76
+ fit(sidebarLines[row] ?? "", sidebarWidth - 2),
77
+ line + style.vertical + ansi.reset,
78
+ fit(mainLines[row] ?? "", mainWidth - 2),
79
+ ];
80
+ if (rightWidth > 0) {
81
+ parts.push(line + style.vertical + ansi.reset, fit(rightLines[row] ?? "", rightWidth - 2), line + style.vertical + ansi.reset);
82
+ }
83
+ else {
84
+ parts.push(line + style.vertical + ansi.reset);
85
+ }
86
+ lines.push(parts.join(""));
87
+ }
88
+ // 6. 底部连接线
89
+ if (rightWidth > 0) {
90
+ lines.push(line +
91
+ style.bottomLeft +
92
+ style.horizontal.repeat(sidebarWidth - 2) +
93
+ style.teeUp +
94
+ style.horizontal.repeat(mainWidth - 2) +
95
+ style.teeUp +
96
+ style.horizontal.repeat(rightWidth - 2) +
97
+ style.bottomRight +
98
+ ansi.reset);
99
+ }
100
+ else {
101
+ lines.push(line +
102
+ style.bottomLeft +
103
+ style.horizontal.repeat(sidebarWidth - 2) +
104
+ style.teeUp +
105
+ style.horizontal.repeat(mainWidth - 2) +
106
+ style.bottomRight +
107
+ ansi.reset);
108
+ }
109
+ // 7. 状态栏
110
+ lines.push(drawStatusBar(state, width));
111
+ return lines.slice(0, height);
112
+ }
113
+ // 绘制顶部标题栏
114
+ function drawHeader(state, width) {
115
+ const account = state.account ? `@${state.account}` : "未登录";
116
+ const title = ` CC98 ${state.viewTitle} `;
117
+ const padding = Math.max(1, width - cellWidth(title) - cellWidth(account));
118
+ return `${cc98BlueBg}${white}${ansi.bold}${fit(`${title}${" ".repeat(padding)}${account}`, width)}${ansi.reset}`;
119
+ }
120
+ // 绘制概览区
121
+ function drawOverview(state, width, height) {
122
+ const rows = [];
123
+ const summary = state.overview.length > 0
124
+ ? state.overview.map((entry) => `${entry.title} ${entry.detail ?? "-"}`).join(" ")
125
+ : "全站概览会在读取十大时更新";
126
+ rows.push(fit(`${cc98BlueSoft} ${summary}`, width));
127
+ return rows.slice(0, height);
128
+ }
129
+ // 绘制左侧导航
130
+ function drawSidebar(state, width, height) {
131
+ const rows = [];
132
+ const navItems = [
133
+ { id: "hot", label: "十大", hint: "热门话题" },
134
+ { id: "favorite", label: "收藏", hint: "版面帖子" },
135
+ { id: "new", label: "最新", hint: "新帖流" },
136
+ { id: "boards", label: "版面", hint: "所有分区" },
137
+ { id: "following", label: "关注", hint: "用户动态" },
138
+ { id: "messages", label: "消息", hint: "未读与私信" },
139
+ { id: "notices", label: "通知", hint: "系统与回复" },
140
+ { id: "me", label: "我的", hint: "当前账号" },
141
+ { id: "settings", label: "设置", hint: "账号与配置" }
142
+ ];
143
+ for (let index = 0; index < height; index++) {
144
+ const nav = navItems[index];
145
+ if (!nav) {
146
+ rows.push(" ".repeat(width));
147
+ continue;
148
+ }
149
+ const active = index === state.navIndex;
150
+ const focused = state.focus === "nav";
151
+ const label = ` ${nav.label}`;
152
+ const hint = width > 14 ? ` ${nav.hint}` : "";
153
+ const text = fit(`${label}${hint}`, width);
154
+ if (active && focused) {
155
+ rows.push(`${bg(0, 130, 202)}${white}${text}${ansi.reset}`);
156
+ }
157
+ else if (active) {
158
+ rows.push(`${bg(5, 46, 74)}${cc98BlueSoft}${text}${ansi.reset}`);
159
+ }
160
+ else {
161
+ rows.push(`${cc98Blue}${label}${ansi.reset}${muted}${fit(hint, Math.max(0, width - cellWidth(label)))}${ansi.reset}`);
162
+ }
163
+ }
164
+ return rows;
165
+ }
166
+ // 绘制主内容区
167
+ function drawMainContent(state, width, height) {
168
+ if (state.mode === "topic") {
169
+ return drawTopicContent(state, width, height);
170
+ }
171
+ if (state.loading) {
172
+ return drawLoadingContent(state, width, height);
173
+ }
174
+ if (state.error) {
175
+ return drawErrorContent(state, width, height);
176
+ }
177
+ return drawListContent(state, width, height);
178
+ }
179
+ // 绘制加载中内容
180
+ function drawLoadingContent(state, width, height) {
181
+ const rows = [];
182
+ rows.push(`${cc98Blue}${ansi.bold} ${state.viewTitle}${ansi.reset}`);
183
+ rows.push(fit(`${muted} 正在加载...${ansi.reset}`, width));
184
+ rows.push(`${line}${"─".repeat(Math.max(0, width - 1))}${ansi.reset}`);
185
+ rows.push(`${muted} ${"· ".repeat(Math.max(1, Math.floor((width - 2) / 2))).slice(0, width - 1)}${ansi.reset}`);
186
+ while (rows.length < height) {
187
+ rows.push(" ".repeat(width));
188
+ }
189
+ return rows.slice(0, height);
190
+ }
191
+ // 绘制错误内容
192
+ function drawErrorContent(state, width, height) {
193
+ const rows = [];
194
+ rows.push(`${cc98Blue}${ansi.bold} ${state.viewTitle}${ansi.reset}`);
195
+ rows.push(`${line}${"─".repeat(Math.max(0, width - 1))}${ansi.reset}`);
196
+ rows.push(`${danger} 请求失败${ansi.reset}`);
197
+ rows.push(fit(` ${state.error}`, width));
198
+ while (rows.length < height) {
199
+ rows.push(" ".repeat(width));
200
+ }
201
+ return rows.slice(0, height);
202
+ }
203
+ // 绘制列表内容
204
+ function drawListContent(state, width, height) {
205
+ const rows = [];
206
+ rows.push(`${cc98Blue}${ansi.bold} ${state.viewTitle}${ansi.reset}`);
207
+ rows.push(`${line}${"─".repeat(Math.max(0, width - 1))}${ansi.reset}`);
208
+ const visibleCapacity = Math.max(1, Math.floor(Math.max(1, height - 3) / 3));
209
+ if (state.itemIndex < state.scroll) {
210
+ state.scroll = state.itemIndex;
211
+ }
212
+ else if (state.itemIndex >= state.scroll + visibleCapacity) {
213
+ state.scroll = state.itemIndex - visibleCapacity + 1;
214
+ }
215
+ const visible = state.items.slice(state.scroll);
216
+ visible.forEach((itemValue, offset) => {
217
+ if (rows.length >= height) {
218
+ return;
219
+ }
220
+ const index = state.scroll + offset;
221
+ const active = index === state.itemIndex && (state.focus === "content" || state.mode === "settings");
222
+ const prefix = active ? `${ok}●${ansi.reset}` : `${muted}•${ansi.reset}`;
223
+ const title = fit(` ${itemValue.title}`, Math.max(10, width - 2));
224
+ rows.push(active ? `${bg(5, 46, 74)}${prefix}${title}${ansi.reset}` : fit(`${prefix}${title}`, width));
225
+ if (itemValue.meta && rows.length < height) {
226
+ rows.push(fit(` ${muted}${itemValue.meta}${ansi.reset}`, width));
227
+ }
228
+ });
229
+ if (visible.length === 0) {
230
+ rows.push(`${muted} 暂无数据${ansi.reset}`);
231
+ }
232
+ while (rows.length < height) {
233
+ rows.push(" ".repeat(width));
234
+ }
235
+ return rows.slice(0, height);
236
+ }
237
+ // 绘制帖子内容
238
+ function drawTopicContent(state, width, height) {
239
+ const rows = [];
240
+ if (state.loading && (!state.topic || state.topic.lines.length === 0)) {
241
+ rows.push(`${cc98Blue} 正在打开帖子...${ansi.reset}`);
242
+ rows.push("");
243
+ rows.push(`${muted} 只加载第一页,不预取未读楼层。${ansi.reset}`);
244
+ while (rows.length < height) {
245
+ rows.push(" ".repeat(width));
246
+ }
247
+ return rows.slice(0, height);
248
+ }
249
+ if (state.error) {
250
+ rows.push(`${danger} 读取帖子失败${ansi.reset}`);
251
+ rows.push(fit(` ${state.error}`, width));
252
+ rows.push("");
253
+ rows.push(`${muted} h/Esc 返回列表${ansi.reset}`);
254
+ while (rows.length < height) {
255
+ rows.push(" ".repeat(width));
256
+ }
257
+ return rows.slice(0, height);
258
+ }
259
+ const topic = state.topic;
260
+ if (!topic) {
261
+ return Array(height).fill(" ".repeat(width));
262
+ }
263
+ rows.push(`${cc98Blue}${ansi.bold} ${topic.title}${ansi.reset}`);
264
+ rows.push(fit(`${muted} ${topic.meta}${ansi.reset}`, width));
265
+ rows.push(`${line}${"─".repeat(Math.max(0, width - 1))}${ansi.reset}`);
266
+ const viewport = Math.max(0, height - rows.length - 1);
267
+ const maxScroll = Math.max(0, topic.lines.length - viewport);
268
+ state.scroll = Math.min(state.scroll, maxScroll);
269
+ const body = topic.lines.slice(state.scroll, state.scroll + viewport);
270
+ for (const bodyLine of body) {
271
+ if (bodyLine.startsWith("[image ")) {
272
+ rows.push(fit(`${cc98BlueSoft}${bodyLine}${ansi.reset}`, width));
273
+ }
274
+ else if (bodyLine.startsWith("│ ")) {
275
+ rows.push(fit(`${muted}${bodyLine}${ansi.reset}`, width));
276
+ }
277
+ else if (/^#\d+ /.test(bodyLine)) {
278
+ rows.push(fit(`${ok}${bodyLine}${ansi.reset}`, width));
279
+ }
280
+ else {
281
+ rows.push(fit(` ${bodyLine}`, width));
282
+ }
283
+ }
284
+ const pageInfo = topic.hasMore
285
+ ? `已载入 ${topic.loaded} 楼,n 下一页`
286
+ : `已载入 ${topic.loaded} 楼,已到底`;
287
+ rows.push(fit(`${muted}${pageInfo}${state.loadingMore ? " · 加载中" : ""}${ansi.reset}`, width));
288
+ while (rows.length < height) {
289
+ rows.push(" ".repeat(width));
290
+ }
291
+ return rows.slice(0, height);
292
+ }
293
+ // 绘制右侧面板
294
+ function drawRightPanel(state, width, height) {
295
+ if (state.mode === "topic" && state.topic) {
296
+ return drawTopicRight(state.topic, state.scroll, width, height);
297
+ }
298
+ if (state.focus === "nav") {
299
+ return drawNavRight(state, width, height);
300
+ }
301
+ return drawItemRight(state, width, height);
302
+ }
303
+ // 绘制导航右侧面板
304
+ function drawNavRight(state, width, height) {
305
+ const rows = [];
306
+ const nav = navItems[state.navIndex];
307
+ rows.push(`${cc98Blue}${ansi.bold} ${nav?.label ?? ""}${ansi.reset}`);
308
+ rows.push(`${muted} ${nav?.hint ?? ""}${ansi.reset}`);
309
+ rows.push(`${line}${"─".repeat(Math.max(0, width - 1))}${ansi.reset}`);
310
+ for (const stat of state.stats) {
311
+ if (rows.length >= height)
312
+ break;
313
+ rows.push(`${muted} ${stat.title}${ansi.reset}`);
314
+ if (stat.detail) {
315
+ rows.push(`${cc98BlueSoft} ${stat.detail}${ansi.reset}`);
316
+ }
317
+ }
318
+ // 删除快捷键提示,只保留统计信息
319
+ while (rows.length < height) {
320
+ rows.push(" ".repeat(width));
321
+ }
322
+ return rows.slice(0, height);
323
+ }
324
+ // 绘制列表项右侧面板
325
+ function drawItemRight(state, width, height) {
326
+ const rows = [];
327
+ const selected = state.items[state.itemIndex];
328
+ if (!selected) {
329
+ return Array(height).fill(" ".repeat(width));
330
+ }
331
+ rows.push(`${cc98Blue}${ansi.bold} ${selected.title}${ansi.reset}`);
332
+ rows.push(`${line}${"─".repeat(Math.max(0, width - 1))}${ansi.reset}`);
333
+ if (selected.meta) {
334
+ rows.push(`${muted} ${selected.meta}${ansi.reset}`);
335
+ }
336
+ if (selected.detail) {
337
+ rows.push(`${cc98BlueSoft} ${selected.detail}${ansi.reset}`);
338
+ }
339
+ if (selected.topicId !== undefined) {
340
+ rows.push(`${muted} 主题 #${selected.topicId}${ansi.reset}`);
341
+ }
342
+ if (selected.boardId !== undefined) {
343
+ rows.push(`${muted} 版面 #${selected.boardId}${ansi.reset}`);
344
+ }
345
+ if (selected.userId !== undefined) {
346
+ rows.push(`${muted} 用户 #${selected.userId}${ansi.reset}`);
347
+ }
348
+ if (selected.sortTime) {
349
+ const date = new Date(selected.sortTime);
350
+ const timeStr = date.toLocaleString('zh-CN', { month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' });
351
+ rows.push(`${muted} 时间: ${timeStr}${ansi.reset}`);
352
+ }
353
+ while (rows.length < height) {
354
+ rows.push(" ".repeat(width));
355
+ }
356
+ return rows.slice(0, height);
357
+ }
358
+ // 绘制帖子右侧面板
359
+ function drawTopicRight(topic, scroll, width, height) {
360
+ const rows = [];
361
+ const currentPost = topic.posts.find((p) => scroll >= p.lineStart && scroll <= p.lineEnd);
362
+ rows.push(`${cc98Blue}${ansi.bold} 帖子信息${ansi.reset}`);
363
+ rows.push(`${line}${"─".repeat(Math.max(0, width - 1))}${ansi.reset}`);
364
+ if (currentPost) {
365
+ rows.push(`${muted} 楼层: #${currentPost.floor ?? "?"}${ansi.reset}`);
366
+ rows.push(`${muted} 作者: ${currentPost.author}${ansi.reset}`);
367
+ rows.push(`${muted} 时间: ${currentPost.time}${ansi.reset}`);
368
+ if (currentPost.likeCount > 0) {
369
+ rows.push(`${ok} 赞: ${currentPost.likeCount}${ansi.reset}`);
370
+ }
371
+ if (currentPost.dislikeCount > 0) {
372
+ rows.push(`${danger} 踩: ${currentPost.dislikeCount}${ansi.reset}`);
373
+ }
374
+ if (currentPost.rating) {
375
+ rows.push(`${muted} 评分: ${currentPost.rating}${ansi.reset}`);
376
+ }
377
+ if (currentPost.imageCount > 0) {
378
+ rows.push(`${muted} 图片: ${currentPost.imageCount}${ansi.reset}`);
379
+ }
380
+ if (currentPost.linkCount > 0) {
381
+ rows.push(`${muted} 链接: ${currentPost.linkCount}${ansi.reset}`);
382
+ }
383
+ }
384
+ rows.push(`${line}${"─".repeat(Math.max(0, width - 1))}${ansi.reset}`);
385
+ rows.push(`${muted} 当前: ${scroll + 1}/${topic.lines.length}${ansi.reset}`);
386
+ rows.push(`${muted} 已加载: ${topic.loaded} 楼${ansi.reset}`);
387
+ while (rows.length < height) {
388
+ rows.push(" ".repeat(width));
389
+ }
390
+ return rows.slice(0, height);
391
+ }
392
+ // 绘制状态栏
393
+ function drawStatusBar(state, width) {
394
+ const left = getStatus(state);
395
+ const right = getKeyHints(state);
396
+ const padding = Math.max(1, width - cellWidth(left) - cellWidth(right) - 2);
397
+ return fit(`${muted} ${left}${" ".repeat(padding)}${right} `, width);
398
+ }
399
+ // 获取状态文本
400
+ function getStatus(state) {
401
+ if (state.loading) {
402
+ return "加载中...";
403
+ }
404
+ if (state.error) {
405
+ return `错误: ${state.error}`;
406
+ }
407
+ if (state.inputMode) {
408
+ return state.inputPrompt;
409
+ }
410
+ return state.status || getDefaultStatus(state);
411
+ }
412
+ // 获取默认状态文本
413
+ function getDefaultStatus(state) {
414
+ switch (state.mode) {
415
+ case "topic":
416
+ return "帖子阅读";
417
+ case "settings":
418
+ return "设置";
419
+ default:
420
+ if (state.currentBoard) {
421
+ return `版面 #${state.currentBoard.boardId}`;
422
+ }
423
+ if (state.currentChat) {
424
+ return "私信";
425
+ }
426
+ return state.focus === "nav" ? "导航" : "列表";
427
+ }
428
+ }
429
+ // 获取快捷键提示
430
+ function getKeyHints(state) {
431
+ if (state.modal === "search") {
432
+ return "Enter 搜索/打开 Tab 切换 / 关闭";
433
+ }
434
+ if (state.modal === "menu") {
435
+ return "j/k 移动 Enter 执行 o 关闭";
436
+ }
437
+ if (state.modal === "user") {
438
+ return "f 关注 m 私信 u 关闭";
439
+ }
440
+ if (state.mode === "topic") {
441
+ return "j/k 滚动 n 下页 h 返回 s 收藏 l/d 赞踩 u 用户";
442
+ }
443
+ if (state.mode === "settings") {
444
+ return "j/k 选择 Enter 执行 h 返回";
445
+ }
446
+ if (state.currentChat) {
447
+ return "j/k 滚动 n 更多 h 返回 r 刷新";
448
+ }
449
+ return state.focus === "nav"
450
+ ? "j/k 切换 Enter 进入 r 刷新 / 搜索 ? 帮助 q 退出"
451
+ : "j/k 选择 Enter 打开 h 返回 r 刷新 / 搜索 ? 帮助 q 退出";
452
+ }
453
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/tui/components/layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { TuiState } from "../state/types.js";
2
+ import type { Component } from "./types.js";
3
+ export declare class Overview implements Component {
4
+ visible: boolean;
5
+ render(state: TuiState, width: number, height: number): string[];
6
+ }
7
+ //# sourceMappingURL=overview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overview.d.ts","sourceRoot":"","sources":["../../../src/tui/components/overview.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAQ5C,qBAAa,QAAS,YAAW,SAAS;IACxC,OAAO,UAAQ;IAEf,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;CAuBjE"}
@@ -0,0 +1,30 @@
1
+ // 概览区组件
2
+ import { fg, ansi } from "../ansi.js";
3
+ import { fit } from "./utils.js";
4
+ const cc98BlueSoft = fg(94, 180, 232);
5
+ const danger = fg(245, 101, 101);
6
+ const muted = fg(139, 152, 166);
7
+ export class Overview {
8
+ visible = true;
9
+ render(state, width, height) {
10
+ const rows = [];
11
+ if (state.overview.length === 0) {
12
+ rows.push(fit(`${muted} 加载中...`, width));
13
+ return rows.slice(0, height);
14
+ }
15
+ const parts = [];
16
+ for (const entry of state.overview) {
17
+ const value = entry.detail ?? "-";
18
+ // 未读数大于 0 时用红色高亮
19
+ if (entry.title === "未读" && value !== "0") {
20
+ parts.push(`${entry.title} ${danger}${value}${ansi.reset}`);
21
+ }
22
+ else {
23
+ parts.push(`${entry.title} ${value}`);
24
+ }
25
+ }
26
+ rows.push(fit(`${cc98BlueSoft} ${parts.join(" ")}`, width));
27
+ return rows.slice(0, height);
28
+ }
29
+ }
30
+ //# sourceMappingURL=overview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overview.js","sourceRoot":"","sources":["../../../src/tui/components/overview.ts"],"names":[],"mappings":"AAAA,QAAQ;AAIR,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjC,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACtC,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACjC,MAAM,KAAK,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEhC,MAAM,OAAO,QAAQ;IACnB,OAAO,GAAG,IAAI,CAAC;IAEf,MAAM,CAAC,KAAe,EAAE,KAAa,EAAE,MAAc;QACnD,MAAM,IAAI,GAAa,EAAE,CAAC;QAE1B,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC;YAClC,iBAAiB;YACjB,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;gBAC1C,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;QAE7D,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import type { TuiState } from "../state/types.js";
2
+ import type { Component } from "./types.js";
3
+ export declare class Sidebar implements Component {
4
+ visible: boolean;
5
+ render(state: TuiState, width: number, height: number): string[];
6
+ }
7
+ //# sourceMappingURL=sidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../../src/tui/components/sidebar.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAW,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAqB5C,qBAAa,OAAQ,YAAW,SAAS;IACvC,OAAO,UAAQ;IAEf,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;CAoCjE"}
@@ -0,0 +1,57 @@
1
+ // 左栏导航组件
2
+ import { ansi, bg, fg } from "../ansi.js";
3
+ import { fit, cellWidth } from "./utils.js";
4
+ const cc98Blue = fg(0, 130, 202);
5
+ const cc98BlueSoft = fg(94, 180, 232);
6
+ const white = fg(245, 250, 255);
7
+ const muted = fg(139, 152, 166);
8
+ const navItems = [
9
+ { id: "hot", label: "十大", hint: "热门话题" },
10
+ { id: "favorite", label: "收藏", hint: "版面帖子" },
11
+ { id: "new", label: "最新", hint: "新帖流" },
12
+ { id: "boards", label: "版面", hint: "所有分区" },
13
+ { id: "following", label: "关注", hint: "用户动态" },
14
+ { id: "messages", label: "消息", hint: "未读与私信" },
15
+ { id: "notices", label: "通知", hint: "系统与回复" },
16
+ { id: "me", label: "我的", hint: "当前账号" },
17
+ { id: "settings", label: "设置", hint: "账号与配置" }
18
+ ];
19
+ export class Sidebar {
20
+ visible = true;
21
+ render(state, width, height) {
22
+ const rows = [];
23
+ // 计算滚动窗口:确保选中项可见
24
+ const total = navItems.length;
25
+ let offset = 0;
26
+ if (total > height) {
27
+ // 选中项在窗口中间偏上
28
+ offset = Math.max(0, state.navIndex - Math.floor(height / 3));
29
+ // 不超过最大偏移
30
+ offset = Math.min(offset, total - height);
31
+ }
32
+ for (let row = 0; row < height; row += 1) {
33
+ const index = offset + row;
34
+ const nav = navItems[index];
35
+ if (!nav) {
36
+ rows.push(" ".repeat(width));
37
+ continue;
38
+ }
39
+ const active = index === state.navIndex;
40
+ const focused = state.focus === "nav";
41
+ const label = ` ${nav.label}`;
42
+ const hint = width > 16 ? ` ${nav.hint}` : "";
43
+ const text = fit(`${label}${hint}`, width);
44
+ if (active && focused) {
45
+ rows.push(`${bg(0, 130, 202)}${white}${text}${ansi.reset}`);
46
+ }
47
+ else if (active) {
48
+ rows.push(`${bg(5, 46, 74)}${cc98BlueSoft}${text}${ansi.reset}`);
49
+ }
50
+ else {
51
+ rows.push(`${cc98Blue}${label}${ansi.reset}${muted}${fit(hint, Math.max(0, width - cellWidth(label)))}${ansi.reset}`);
52
+ }
53
+ }
54
+ return rows;
55
+ }
56
+ }
57
+ //# sourceMappingURL=sidebar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.js","sourceRoot":"","sources":["../../../src/tui/components/sidebar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { TuiState } from "../state/types.js";
2
+ import type { Component } from "./types.js";
3
+ export declare class StatusBar implements Component {
4
+ visible: boolean;
5
+ render(state: TuiState, width: number): string;
6
+ private getKeyHints;
7
+ }
8
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/tui/components/status.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAQ5C,qBAAa,SAAU,YAAW,SAAS;IACzC,OAAO,UAAQ;IAEf,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAU9C,OAAO,CAAC,WAAW;CAuBpB"}