@walavave/cc98-cli 0.2.1 → 0.2.2

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 (242) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +8 -2
  3. package/assets/forum-images/ac-dark/01.png +0 -0
  4. package/assets/forum-images/ac-dark/02.png +0 -0
  5. package/assets/forum-images/ac-dark/03.png +0 -0
  6. package/assets/forum-images/ac-dark/04.png +0 -0
  7. package/assets/forum-images/ac-dark/05.png +0 -0
  8. package/assets/forum-images/ac-dark/06.png +0 -0
  9. package/assets/forum-images/ac-dark/07.png +0 -0
  10. package/assets/forum-images/ac-dark/08.png +0 -0
  11. package/assets/forum-images/ac-dark/09.png +0 -0
  12. package/assets/forum-images/ac-dark/10.png +0 -0
  13. package/assets/forum-images/ac-dark/1001.png +0 -0
  14. package/assets/forum-images/ac-dark/1002.png +0 -0
  15. package/assets/forum-images/ac-dark/1003.png +0 -0
  16. package/assets/forum-images/ac-dark/1004.png +0 -0
  17. package/assets/forum-images/ac-dark/1005.png +0 -0
  18. package/assets/forum-images/ac-dark/1006.png +0 -0
  19. package/assets/forum-images/ac-dark/1007.png +0 -0
  20. package/assets/forum-images/ac-dark/1008.png +0 -0
  21. package/assets/forum-images/ac-dark/1009.png +0 -0
  22. package/assets/forum-images/ac-dark/1010.png +0 -0
  23. package/assets/forum-images/ac-dark/1011.png +0 -0
  24. package/assets/forum-images/ac-dark/1012.png +0 -0
  25. package/assets/forum-images/ac-dark/1013.png +0 -0
  26. package/assets/forum-images/ac-dark/1014.png +0 -0
  27. package/assets/forum-images/ac-dark/1015.png +0 -0
  28. package/assets/forum-images/ac-dark/1016.png +0 -0
  29. package/assets/forum-images/ac-dark/1017.png +0 -0
  30. package/assets/forum-images/ac-dark/1018.png +0 -0
  31. package/assets/forum-images/ac-dark/1019.png +0 -0
  32. package/assets/forum-images/ac-dark/1020.png +0 -0
  33. package/assets/forum-images/ac-dark/1021.png +0 -0
  34. package/assets/forum-images/ac-dark/1022.png +0 -0
  35. package/assets/forum-images/ac-dark/1023.png +0 -0
  36. package/assets/forum-images/ac-dark/1024.png +0 -0
  37. package/assets/forum-images/ac-dark/1025.png +0 -0
  38. package/assets/forum-images/ac-dark/1026.png +0 -0
  39. package/assets/forum-images/ac-dark/1027.png +0 -0
  40. package/assets/forum-images/ac-dark/1028.png +0 -0
  41. package/assets/forum-images/ac-dark/1029.png +0 -0
  42. package/assets/forum-images/ac-dark/1030.png +0 -0
  43. package/assets/forum-images/ac-dark/1031.png +0 -0
  44. package/assets/forum-images/ac-dark/1032.png +0 -0
  45. package/assets/forum-images/ac-dark/1033.png +0 -0
  46. package/assets/forum-images/ac-dark/1034.png +0 -0
  47. package/assets/forum-images/ac-dark/1035.png +0 -0
  48. package/assets/forum-images/ac-dark/1036.png +0 -0
  49. package/assets/forum-images/ac-dark/1037.png +0 -0
  50. package/assets/forum-images/ac-dark/1038.png +0 -0
  51. package/assets/forum-images/ac-dark/1039.png +0 -0
  52. package/assets/forum-images/ac-dark/1040.png +0 -0
  53. package/assets/forum-images/ac-dark/11.png +0 -0
  54. package/assets/forum-images/ac-dark/12.png +0 -0
  55. package/assets/forum-images/ac-dark/13.png +0 -0
  56. package/assets/forum-images/ac-dark/14.png +0 -0
  57. package/assets/forum-images/ac-dark/15.png +0 -0
  58. package/assets/forum-images/ac-dark/16.png +0 -0
  59. package/assets/forum-images/ac-dark/17.png +0 -0
  60. package/assets/forum-images/ac-dark/18.png +0 -0
  61. package/assets/forum-images/ac-dark/19.png +0 -0
  62. package/assets/forum-images/ac-dark/20.png +0 -0
  63. package/assets/forum-images/ac-dark/2001.png +0 -0
  64. package/assets/forum-images/ac-dark/2002.png +0 -0
  65. package/assets/forum-images/ac-dark/2003.png +0 -0
  66. package/assets/forum-images/ac-dark/2004.png +0 -0
  67. package/assets/forum-images/ac-dark/2005.png +0 -0
  68. package/assets/forum-images/ac-dark/2006.png +0 -0
  69. package/assets/forum-images/ac-dark/2007.png +0 -0
  70. package/assets/forum-images/ac-dark/2008.png +0 -0
  71. package/assets/forum-images/ac-dark/2009.png +0 -0
  72. package/assets/forum-images/ac-dark/2010.png +0 -0
  73. package/assets/forum-images/ac-dark/2011.png +0 -0
  74. package/assets/forum-images/ac-dark/2012.png +0 -0
  75. package/assets/forum-images/ac-dark/2013.png +0 -0
  76. package/assets/forum-images/ac-dark/2014.png +0 -0
  77. package/assets/forum-images/ac-dark/2015.png +0 -0
  78. package/assets/forum-images/ac-dark/2016.png +0 -0
  79. package/assets/forum-images/ac-dark/2017.png +0 -0
  80. package/assets/forum-images/ac-dark/2018.png +0 -0
  81. package/assets/forum-images/ac-dark/2019.png +0 -0
  82. package/assets/forum-images/ac-dark/2020.png +0 -0
  83. package/assets/forum-images/ac-dark/2021.png +0 -0
  84. package/assets/forum-images/ac-dark/2022.png +0 -0
  85. package/assets/forum-images/ac-dark/2023.png +0 -0
  86. package/assets/forum-images/ac-dark/2024.png +0 -0
  87. package/assets/forum-images/ac-dark/2025.png +0 -0
  88. package/assets/forum-images/ac-dark/2026.png +0 -0
  89. package/assets/forum-images/ac-dark/2027.png +0 -0
  90. package/assets/forum-images/ac-dark/2028.png +0 -0
  91. package/assets/forum-images/ac-dark/2029.png +0 -0
  92. package/assets/forum-images/ac-dark/2030.png +0 -0
  93. package/assets/forum-images/ac-dark/2031.png +0 -0
  94. package/assets/forum-images/ac-dark/2032.png +0 -0
  95. package/assets/forum-images/ac-dark/2033.png +0 -0
  96. package/assets/forum-images/ac-dark/2034.png +0 -0
  97. package/assets/forum-images/ac-dark/2035.png +0 -0
  98. package/assets/forum-images/ac-dark/2036.png +0 -0
  99. package/assets/forum-images/ac-dark/2037.png +0 -0
  100. package/assets/forum-images/ac-dark/2038.png +0 -0
  101. package/assets/forum-images/ac-dark/2039.png +0 -0
  102. package/assets/forum-images/ac-dark/2040.png +0 -0
  103. package/assets/forum-images/ac-dark/2041.png +0 -0
  104. package/assets/forum-images/ac-dark/2042.png +0 -0
  105. package/assets/forum-images/ac-dark/2043.png +0 -0
  106. package/assets/forum-images/ac-dark/2044.png +0 -0
  107. package/assets/forum-images/ac-dark/2045.png +0 -0
  108. package/assets/forum-images/ac-dark/2046.png +0 -0
  109. package/assets/forum-images/ac-dark/2047.png +0 -0
  110. package/assets/forum-images/ac-dark/2048.png +0 -0
  111. package/assets/forum-images/ac-dark/2049.png +0 -0
  112. package/assets/forum-images/ac-dark/2050.png +0 -0
  113. package/assets/forum-images/ac-dark/2051.png +0 -0
  114. package/assets/forum-images/ac-dark/2052.png +0 -0
  115. package/assets/forum-images/ac-dark/2053.png +0 -0
  116. package/assets/forum-images/ac-dark/2054.png +0 -0
  117. package/assets/forum-images/ac-dark/2055.png +0 -0
  118. package/assets/forum-images/ac-dark/21.png +0 -0
  119. package/assets/forum-images/ac-dark/22.png +0 -0
  120. package/assets/forum-images/ac-dark/23.png +0 -0
  121. package/assets/forum-images/ac-dark/24.png +0 -0
  122. package/assets/forum-images/ac-dark/25.png +0 -0
  123. package/assets/forum-images/ac-dark/26.png +0 -0
  124. package/assets/forum-images/ac-dark/27.png +0 -0
  125. package/assets/forum-images/ac-dark/28.png +0 -0
  126. package/assets/forum-images/ac-dark/29.png +0 -0
  127. package/assets/forum-images/ac-dark/30.png +0 -0
  128. package/assets/forum-images/ac-dark/31.png +0 -0
  129. package/assets/forum-images/ac-dark/32.png +0 -0
  130. package/assets/forum-images/ac-dark/33.png +0 -0
  131. package/assets/forum-images/ac-dark/34.png +0 -0
  132. package/assets/forum-images/ac-dark/35.png +0 -0
  133. package/assets/forum-images/ac-dark/36.png +0 -0
  134. package/assets/forum-images/ac-dark/37.png +0 -0
  135. package/assets/forum-images/ac-dark/38.png +0 -0
  136. package/assets/forum-images/ac-dark/39.png +0 -0
  137. package/assets/forum-images/ac-dark/40.png +0 -0
  138. package/assets/forum-images/ac-dark/41.png +0 -0
  139. package/assets/forum-images/ac-dark/42.png +0 -0
  140. package/assets/forum-images/ac-dark/43.png +0 -0
  141. package/assets/forum-images/ac-dark/44.png +0 -0
  142. package/assets/forum-images/ac-dark/45.png +0 -0
  143. package/assets/forum-images/ac-dark/46.png +0 -0
  144. package/assets/forum-images/ac-dark/47.png +0 -0
  145. package/assets/forum-images/ac-dark/48.png +0 -0
  146. package/assets/forum-images/ac-dark/49.png +0 -0
  147. package/assets/forum-images/ac-dark/50.png +0 -0
  148. package/assets/forum-images/ac-dark/51.png +0 -0
  149. package/assets/forum-images/ac-dark/52.png +0 -0
  150. package/assets/forum-images/ac-dark/53.png +0 -0
  151. package/assets/forum-images/ac-dark/54.png +0 -0
  152. package/dist/api/client.d.ts +1 -0
  153. package/dist/api/client.d.ts.map +1 -1
  154. package/dist/api/client.js +17 -0
  155. package/dist/api/client.js.map +1 -1
  156. package/dist/api/endpoints.d.ts +1 -0
  157. package/dist/api/endpoints.d.ts.map +1 -1
  158. package/dist/api/endpoints.js +1 -0
  159. package/dist/api/endpoints.js.map +1 -1
  160. package/dist/config.d.ts +2 -0
  161. package/dist/config.d.ts.map +1 -1
  162. package/dist/config.js +25 -4
  163. package/dist/config.js.map +1 -1
  164. package/dist/tui/app-runtime/content.d.ts +9 -0
  165. package/dist/tui/app-runtime/content.d.ts.map +1 -0
  166. package/dist/tui/app-runtime/content.js +275 -0
  167. package/dist/tui/app-runtime/content.js.map +1 -0
  168. package/dist/tui/app-runtime/context.d.ts +24 -0
  169. package/dist/tui/app-runtime/context.d.ts.map +1 -0
  170. package/dist/tui/app-runtime/context.js +2 -0
  171. package/dist/tui/app-runtime/context.js.map +1 -0
  172. package/dist/tui/app-runtime/image-viewer.d.ts +5 -0
  173. package/dist/tui/app-runtime/image-viewer.d.ts.map +1 -0
  174. package/dist/tui/app-runtime/image-viewer.js +112 -0
  175. package/dist/tui/app-runtime/image-viewer.js.map +1 -0
  176. package/dist/tui/app-runtime/interactions.d.ts +6 -0
  177. package/dist/tui/app-runtime/interactions.d.ts.map +1 -0
  178. package/dist/tui/app-runtime/interactions.js +181 -0
  179. package/dist/tui/app-runtime/interactions.js.map +1 -0
  180. package/dist/tui/app-runtime/keyboard.d.ts +3 -0
  181. package/dist/tui/app-runtime/keyboard.d.ts.map +1 -0
  182. package/dist/tui/app-runtime/keyboard.js +284 -0
  183. package/dist/tui/app-runtime/keyboard.js.map +1 -0
  184. package/dist/tui/app-runtime/modals.d.ts +17 -0
  185. package/dist/tui/app-runtime/modals.d.ts.map +1 -0
  186. package/dist/tui/app-runtime/modals.js +343 -0
  187. package/dist/tui/app-runtime/modals.js.map +1 -0
  188. package/dist/tui/app-runtime/mouse.d.ts +5 -0
  189. package/dist/tui/app-runtime/mouse.d.ts.map +1 -0
  190. package/dist/tui/app-runtime/mouse.js +68 -0
  191. package/dist/tui/app-runtime/mouse.js.map +1 -0
  192. package/dist/tui/app-runtime/state.d.ts +6 -0
  193. package/dist/tui/app-runtime/state.d.ts.map +1 -0
  194. package/dist/tui/app-runtime/state.js +41 -0
  195. package/dist/tui/app-runtime/state.js.map +1 -0
  196. package/dist/tui/app-runtime/topic.d.ts +6 -0
  197. package/dist/tui/app-runtime/topic.d.ts.map +1 -0
  198. package/dist/tui/app-runtime/topic.js +184 -0
  199. package/dist/tui/app-runtime/topic.js.map +1 -0
  200. package/dist/tui/app-runtime.d.ts +2 -27
  201. package/dist/tui/app-runtime.d.ts.map +1 -1
  202. package/dist/tui/app-runtime.js +2 -1132
  203. package/dist/tui/app-runtime.js.map +1 -1
  204. package/dist/tui/app.d.ts.map +1 -1
  205. package/dist/tui/app.js +2 -1
  206. package/dist/tui/app.js.map +1 -1
  207. package/dist/tui/cached-client.d.ts +1 -0
  208. package/dist/tui/cached-client.d.ts.map +1 -1
  209. package/dist/tui/cached-client.js +3 -0
  210. package/dist/tui/cached-client.js.map +1 -1
  211. package/dist/tui/emotion-catalog.d.ts +23 -0
  212. package/dist/tui/emotion-catalog.d.ts.map +1 -0
  213. package/dist/tui/emotion-catalog.js +150 -0
  214. package/dist/tui/emotion-catalog.js.map +1 -0
  215. package/dist/tui/emotion-preview.js +1 -1
  216. package/dist/tui/emotion-preview.js.map +1 -1
  217. package/dist/tui/image-preview.d.ts.map +1 -1
  218. package/dist/tui/image-preview.js +2 -1
  219. package/dist/tui/image-preview.js.map +1 -1
  220. package/dist/tui/keymap.d.ts +1 -1
  221. package/dist/tui/keymap.d.ts.map +1 -1
  222. package/dist/tui/keymap.js +2 -0
  223. package/dist/tui/keymap.js.map +1 -1
  224. package/dist/tui/renderer.d.ts.map +1 -1
  225. package/dist/tui/renderer.js +212 -3
  226. package/dist/tui/renderer.js.map +1 -1
  227. package/dist/tui/terminal.d.ts +3 -0
  228. package/dist/tui/terminal.d.ts.map +1 -1
  229. package/dist/tui/terminal.js +37 -0
  230. package/dist/tui/terminal.js.map +1 -1
  231. package/dist/tui/theme.d.ts +1 -0
  232. package/dist/tui/theme.d.ts.map +1 -1
  233. package/dist/tui/theme.js +1 -0
  234. package/dist/tui/theme.js.map +1 -1
  235. package/dist/tui/tui-model.d.ts +11 -1
  236. package/dist/tui/tui-model.d.ts.map +1 -1
  237. package/dist/tui/tui-model.js.map +1 -1
  238. package/dist/tui/ubb-renderer.js +1 -1
  239. package/dist/tui/ubb-renderer.js.map +1 -1
  240. package/dist/version.d.ts +1 -1
  241. package/dist/version.js +1 -1
  242. package/package.json +1 -1
@@ -0,0 +1,181 @@
1
+ import { downloadUrlToDownloads } from "../downloads.js";
2
+ import { fill, length, pad, rect, split } from "../layout.js";
3
+ import { getSidebarWidth } from "../renderer.js";
4
+ import { getStatus, navItems, settingsItems } from "../tui-model.js";
5
+ import { getContentListScroll } from "./content.js";
6
+ import { enterContentMode, showNotification } from "./state.js";
7
+ export async function handleTopicClick(context, event, columns, rows) {
8
+ const { state, render } = context;
9
+ if (state.mode !== "topic" || !state.topic || state.loading || state.error) {
10
+ return;
11
+ }
12
+ const mainArea = getMainAreaRect(columns, rows, context.config, state.sidebarWidth);
13
+ if (!withinRect(event.column, event.row, mainArea)) {
14
+ return;
15
+ }
16
+ const bodyRow = event.row - (mainArea.y + 1);
17
+ const bodyLineIndex = bodyRow - 3;
18
+ if (bodyLineIndex < 0) {
19
+ return;
20
+ }
21
+ const absoluteLine = state.scroll + bodyLineIndex;
22
+ const lineEntry = state.topic.posts
23
+ .flatMap((post) => post.lines)
24
+ .find((entry) => entry.line === absoluteLine);
25
+ const url = lineEntry?.linkUrl ?? lineEntry?.imageUrl;
26
+ if (!url) {
27
+ return;
28
+ }
29
+ state.status = `正在下载 ${shortUrl(url)}...`;
30
+ render();
31
+ try {
32
+ const savedPath = await downloadUrlToDownloads(url);
33
+ showNotification(state, `已下载到 ${savedPath}`);
34
+ }
35
+ catch (error) {
36
+ state.status = error instanceof Error ? error.message : "下载失败";
37
+ }
38
+ finally {
39
+ render();
40
+ }
41
+ }
42
+ export function handleSidebarClick(context, event, columns, rows) {
43
+ const { state, render, load, abortCurrent } = context;
44
+ if (state.mode === "topic") {
45
+ return false;
46
+ }
47
+ const sidebarArea = getSidebarAreaRect(columns, rows, context.config, state.sidebarWidth);
48
+ if (sidebarArea.width <= 0 || !withinRect(event.column, event.row, sidebarArea)) {
49
+ return false;
50
+ }
51
+ const rowIndex = event.row - (sidebarArea.y + 1);
52
+ if (rowIndex < 0 || rowIndex >= navItems.length) {
53
+ return true;
54
+ }
55
+ const nextNavIndex = Math.max(0, Math.min(navItems.length - 1, rowIndex));
56
+ if (state.navIndex === nextNavIndex && state.focus === "nav" && state.mode !== "settings") {
57
+ return true;
58
+ }
59
+ abortCurrent();
60
+ state.navIndex = nextNavIndex;
61
+ state.focus = "nav";
62
+ if (state.mode === "settings") {
63
+ state.mode = "list";
64
+ }
65
+ state.status = getStatus(state);
66
+ render();
67
+ void load();
68
+ return true;
69
+ }
70
+ export function handleContentClick(context, event, columns, rows) {
71
+ const { state, render } = context;
72
+ if (state.mode === "topic" || state.loading || state.error) {
73
+ return false;
74
+ }
75
+ const mainArea = getMainAreaRect(columns, rows, context.config, state.sidebarWidth);
76
+ if (!withinRect(event.column, event.row, mainArea)) {
77
+ return false;
78
+ }
79
+ if (navItems[state.navIndex]?.id === "settings" && state.mode !== "settings") {
80
+ state.mode = "settings";
81
+ }
82
+ if (state.mode === "settings") {
83
+ const rowIndex = event.row - (mainArea.y + 1) - 2;
84
+ if (rowIndex < 0 || rowIndex >= settingsItems.length) {
85
+ return true;
86
+ }
87
+ state.itemIndex = rowIndex;
88
+ enterContentMode(state);
89
+ render();
90
+ return true;
91
+ }
92
+ if (state.currentSearch) {
93
+ const rowIndex = event.row - (mainArea.y + 1);
94
+ if (rowIndex === 1) {
95
+ state.currentSearch.focus = "input";
96
+ enterContentMode(state);
97
+ render();
98
+ return true;
99
+ }
100
+ if (rowIndex < 3) {
101
+ return true;
102
+ }
103
+ const itemHeight = 2;
104
+ const visibleCapacity = Math.max(1, Math.floor(Math.max(1, mainArea.height - 3) / itemHeight));
105
+ const scroll = getContentListScroll(state, visibleCapacity);
106
+ const itemOffset = Math.floor((rowIndex - 3) / itemHeight);
107
+ const itemIndex = scroll + itemOffset;
108
+ if (itemIndex < 0 || itemIndex >= state.items.length) {
109
+ return true;
110
+ }
111
+ state.itemIndex = itemIndex;
112
+ state.currentSearch.focus = "results";
113
+ enterContentMode(state);
114
+ render();
115
+ return true;
116
+ }
117
+ const rowIndex = event.row - (mainArea.y + 1) - 2;
118
+ if (rowIndex < 0) {
119
+ return true;
120
+ }
121
+ const itemHeight = 2;
122
+ if (rowIndex % itemHeight !== 0 && rowIndex % itemHeight !== 1) {
123
+ return true;
124
+ }
125
+ const visibleCapacity = Math.max(1, Math.floor(Math.max(1, mainArea.height - 2) / itemHeight));
126
+ const scroll = getContentListScroll(state, visibleCapacity);
127
+ const itemOffset = Math.floor(rowIndex / itemHeight);
128
+ const itemIndex = scroll + itemOffset;
129
+ if (itemIndex < 0 || itemIndex >= state.items.length) {
130
+ return true;
131
+ }
132
+ state.itemIndex = itemIndex;
133
+ enterContentMode(state);
134
+ render();
135
+ return true;
136
+ }
137
+ function getMainAreaRect(columns, rows, config, sidebarWidthOverride) {
138
+ const { mainArea } = getBodyColumnRects(columns, rows, config, sidebarWidthOverride);
139
+ return mainArea;
140
+ }
141
+ function getSidebarAreaRect(columns, rows, config, sidebarWidthOverride) {
142
+ const { sidebarArea } = getBodyColumnRects(columns, rows, config, sidebarWidthOverride);
143
+ return sidebarArea;
144
+ }
145
+ function getBodyColumnRects(columns, rows, config, sidebarWidthOverride) {
146
+ const width = Math.max(1, columns);
147
+ const height = Math.max(1, rows);
148
+ const outer = rect(width, Math.max(0, height - 1));
149
+ const root = pad(outer, 1);
150
+ const verticalLayout = config.hideTopChrome
151
+ ? [fill()]
152
+ : [length(1), length(1), length(1), length(1), fill()];
153
+ const areas = split(root, "vertical", verticalLayout);
154
+ const bodyArea = config.hideTopChrome ? areas[0] : areas[4];
155
+ const sidebarWidth = getSidebarWidth(width, sidebarWidthOverride);
156
+ const bodyColumns = split(bodyArea, "horizontal", [
157
+ length(sidebarWidth),
158
+ length(sidebarWidth > 0 ? 1 : 0),
159
+ fill()
160
+ ]);
161
+ return {
162
+ sidebarArea: bodyColumns[0],
163
+ mainArea: bodyColumns[2]
164
+ };
165
+ }
166
+ function withinRect(column, row, area) {
167
+ const x = column - 1;
168
+ const y = row - 1;
169
+ return x >= area.x && x < area.x + area.width && y >= area.y && y < area.y + area.height;
170
+ }
171
+ function shortUrl(value) {
172
+ try {
173
+ const url = new URL(value);
174
+ const fileName = url.pathname.split("/").filter(Boolean).at(-1) ?? url.host;
175
+ return `${url.host}/${fileName}`;
176
+ }
177
+ catch {
178
+ return value;
179
+ }
180
+ }
181
+ //# sourceMappingURL=interactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactions.js","sourceRoot":"","sources":["../../../src/tui/app-runtime/interactions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RuntimeContext } from "./context.js";
2
+ export declare function createKeyHandler(context: RuntimeContext): (key: string) => void;
3
+ //# sourceMappingURL=keyboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../../src/tui/app-runtime/keyboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAoBnD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CA4E/E"}
@@ -0,0 +1,284 @@
1
+ import { jumpToTopicFloor, openTopic } from "../app-data.js";
2
+ import { ensureEmotionPreviews, getEmotionCategory } from "../emotion-catalog.js";
3
+ import { isPrintableInput } from "../account-modal.js";
4
+ import { focusSearchInput, handleContentFocus, handleNavFocus, handleSettingsMode } from "./content.js";
5
+ import { handleImageModal } from "./image-viewer.js";
6
+ import { closeComposeModal, closeEmotionPicker, handleComposeBackspace, handleAccountModal, handleConfirmModal, handleLoginModal, insertComposeText, moveComposeCursor, moveEmotionGrid, moveEmotionSidebar } from "./modals.js";
7
+ import { handleTopicMode } from "./topic.js";
8
+ export function createKeyHandler(context) {
9
+ return (key) => {
10
+ const { keymap, state, close, render } = context;
11
+ const keyAction = keymap.feed(key);
12
+ if (key === "\u0003" || key === "q") {
13
+ close();
14
+ return;
15
+ }
16
+ if (state.modal === "help") {
17
+ if (key === "h" || key === "\x1b[D" || key === "\x1b" || key === "?" || key === "\r") {
18
+ state.modal = null;
19
+ render();
20
+ }
21
+ return;
22
+ }
23
+ if (state.modal === "account") {
24
+ handleAccountModal(context, key);
25
+ return;
26
+ }
27
+ if (state.modal === "login") {
28
+ handleLoginModal(context, key);
29
+ return;
30
+ }
31
+ if (state.modal === "confirm") {
32
+ handleConfirmModal(context, key);
33
+ return;
34
+ }
35
+ if (state.modal === "image") {
36
+ handleImageModal(context, key);
37
+ return;
38
+ }
39
+ if (state.modal === "compose") {
40
+ handleComposeModal(context, key, keyAction);
41
+ return;
42
+ }
43
+ if (state.modal === "emotion-picker") {
44
+ handleEmotionPickerModal(context, key);
45
+ return;
46
+ }
47
+ if (key === "?") {
48
+ state.modal = "help";
49
+ render();
50
+ return;
51
+ }
52
+ if (keyAction === "search.focus-input") {
53
+ void focusSearchInput(context);
54
+ return;
55
+ }
56
+ if (state.mode === "topic") {
57
+ handleTopicMode(context, key, keyAction);
58
+ return;
59
+ }
60
+ if (state.mode === "settings") {
61
+ handleSettingsMode(context, key);
62
+ return;
63
+ }
64
+ if (state.focus === "nav") {
65
+ handleNavFocus(context, key);
66
+ return;
67
+ }
68
+ handleContentFocus(context, key);
69
+ };
70
+ }
71
+ function handleComposeModal(context, key, keyAction) {
72
+ const { state, render } = context;
73
+ const compose = state.composeDialog;
74
+ if (!compose || compose.submitting) {
75
+ return;
76
+ }
77
+ if (key === "\x1b") {
78
+ closeComposeModal(context);
79
+ return;
80
+ }
81
+ if (key === "\x7f") {
82
+ handleComposeBackspace(context);
83
+ render();
84
+ return;
85
+ }
86
+ if (key === "\x1b[D") {
87
+ moveComposeCursor(context, -1);
88
+ render();
89
+ return;
90
+ }
91
+ if (key === "\x1b[C") {
92
+ moveComposeCursor(context, 1);
93
+ render();
94
+ return;
95
+ }
96
+ if (keyAction === "compose.open-emotion") {
97
+ state.modal = "emotion-picker";
98
+ state.status = "表情:方向键选择 Enter 插入 其它键关闭";
99
+ render();
100
+ void warmEmotionPicker(context);
101
+ return;
102
+ }
103
+ if (key === "\r") {
104
+ void submitCompose(context);
105
+ return;
106
+ }
107
+ if (key === "\t") {
108
+ insertComposeText(context, " ");
109
+ render();
110
+ return;
111
+ }
112
+ if (key === "\n") {
113
+ insertComposeText(context, "\n");
114
+ render();
115
+ return;
116
+ }
117
+ if (key === "\x0b") {
118
+ insertComposeText(context, "\n");
119
+ render();
120
+ return;
121
+ }
122
+ if (isPrintableComposeInput(key)) {
123
+ insertComposeText(context, key);
124
+ render();
125
+ }
126
+ }
127
+ function handleEmotionPickerModal(context, key) {
128
+ const { state, render } = context;
129
+ const compose = state.composeDialog;
130
+ if (!compose) {
131
+ state.modal = null;
132
+ render();
133
+ return;
134
+ }
135
+ if (key === "\r") {
136
+ const entry = getCurrentEmotionEntry(compose);
137
+ if (entry) {
138
+ insertComposeText(context, entry.code);
139
+ }
140
+ closeEmotionPicker(context);
141
+ render();
142
+ return;
143
+ }
144
+ if (key === "\x1b") {
145
+ closeEmotionPicker(context);
146
+ render();
147
+ return;
148
+ }
149
+ if (key === "\x1b[A" || key === "k") {
150
+ if (compose.emotionFocus === "sidebar") {
151
+ moveEmotionSidebar(context, -1);
152
+ }
153
+ else {
154
+ moveEmotionGrid(context, -getEmotionGridColumns(context));
155
+ }
156
+ render();
157
+ void warmEmotionPicker(context);
158
+ return;
159
+ }
160
+ if (key === "\x1b[B" || key === "j") {
161
+ if (compose.emotionFocus === "sidebar") {
162
+ moveEmotionSidebar(context, 1);
163
+ }
164
+ else {
165
+ moveEmotionGrid(context, getEmotionGridColumns(context));
166
+ }
167
+ render();
168
+ void warmEmotionPicker(context);
169
+ return;
170
+ }
171
+ if (key === "\x1b[D" || key === "h") {
172
+ if (compose.emotionFocus === "grid") {
173
+ const columns = getEmotionGridColumns(context);
174
+ if (compose.emotionSelectedIndex % columns === 0) {
175
+ compose.emotionFocus = "sidebar";
176
+ }
177
+ else {
178
+ moveEmotionGrid(context, -1);
179
+ }
180
+ render();
181
+ void warmEmotionPicker(context);
182
+ return;
183
+ }
184
+ }
185
+ if (key === "\x1b[C" || key === "l") {
186
+ if (compose.emotionFocus === "sidebar") {
187
+ compose.emotionFocus = "grid";
188
+ render();
189
+ void warmEmotionPicker(context);
190
+ return;
191
+ }
192
+ moveEmotionGrid(context, 1);
193
+ render();
194
+ void warmEmotionPicker(context);
195
+ return;
196
+ }
197
+ closeEmotionPicker(context);
198
+ if (key === "\x7f") {
199
+ handleComposeBackspace(context);
200
+ }
201
+ else if (isPrintableComposeInput(key)) {
202
+ insertComposeText(context, key);
203
+ }
204
+ render();
205
+ }
206
+ function isPrintableComposeInput(key) {
207
+ return key === " " || isPrintableInput(key);
208
+ }
209
+ function getCurrentEmotionEntry(compose) {
210
+ const category = getEmotionCategory(compose.emotionCategoryIndex);
211
+ return category.entries[compose.emotionSelectedIndex];
212
+ }
213
+ function getEmotionGridColumns(context) {
214
+ const width = context.getSize().columns;
215
+ const modalWidth = Math.min(Math.max(1, width - 2), Math.max(56, Math.floor(width * 0.78)));
216
+ const innerWidth = Math.max(1, modalWidth - 2);
217
+ const sidebarWidth = Math.max(8, Math.min(12, Math.floor(innerWidth * 0.2)));
218
+ const gridWidth = Math.max(1, innerWidth - sidebarWidth - 1);
219
+ return Math.max(1, Math.floor(gridWidth / 11));
220
+ }
221
+ async function submitCompose(context) {
222
+ const { client, state, render, config, nextSignal } = context;
223
+ const compose = state.composeDialog;
224
+ const topic = state.topic;
225
+ if (!compose || !topic) {
226
+ return;
227
+ }
228
+ const content = compose.draft.trim();
229
+ if (!content) {
230
+ state.status = "评论内容不能为空";
231
+ render();
232
+ return;
233
+ }
234
+ const payload = config.postSignature ? `${content}${config.postSignature}` : content;
235
+ compose.submitting = true;
236
+ state.status = "正在发送评论...";
237
+ render();
238
+ try {
239
+ const result = await client.replyTopic(topic.topicId, payload);
240
+ const floor = typeof result === "object" && result !== null && typeof result.floor === "number"
241
+ ? result.floor
242
+ : undefined;
243
+ state.composeDialog = undefined;
244
+ state.modal = null;
245
+ await openTopic(client, state, topic.topicId, render, config, true, nextSignal());
246
+ if (floor && state.topic) {
247
+ await jumpToTopicFloor(client, state, floor, render, config, nextSignal());
248
+ }
249
+ state.status = floor ? `已发送到 ${floor} 楼` : "评论已发送";
250
+ render();
251
+ }
252
+ catch (error) {
253
+ compose.submitting = false;
254
+ state.status = `评论发送失败:${error instanceof Error ? error.message : String(error)}`;
255
+ render();
256
+ }
257
+ }
258
+ async function warmEmotionPicker(context) {
259
+ const compose = context.state.composeDialog;
260
+ if (!compose || context.state.modal !== "emotion-picker") {
261
+ return;
262
+ }
263
+ const category = getEmotionCategory(compose.emotionCategoryIndex);
264
+ const columns = getEmotionGridColumns(context);
265
+ const pageRows = getEmotionGridRows(context);
266
+ const pageSize = columns * pageRows;
267
+ const start = Math.max(0, Math.floor(compose.emotionSelectedIndex / pageSize) * pageSize);
268
+ const visible = category.entries.slice(start, start + pageSize);
269
+ try {
270
+ await ensureEmotionPreviews(visible, 9);
271
+ }
272
+ catch {
273
+ return;
274
+ }
275
+ if (context.state.modal === "emotion-picker") {
276
+ context.render();
277
+ }
278
+ }
279
+ function getEmotionGridRows(context) {
280
+ const rows = context.getSize().rows;
281
+ const modalHeight = Math.min(Math.max(1, rows - 2), Math.max(18, Math.floor(rows * 0.72)));
282
+ return Math.max(1, Math.floor(Math.max(1, modalHeight - 4) / 5));
283
+ }
284
+ //# sourceMappingURL=keyboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../../../src/tui/app-runtime/keyboard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACxG,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,UAAU,gBAAgB,CAAC,OAAuB;IACtD,OAAO,CAAC,GAAG,EAAE,EAAE;QACb,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QACjD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEnC,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YACpC,KAAK,EAAE,CAAC;YACR,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC3B,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACrF,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;gBACnB,MAAM,EAAE,CAAC;YACX,CAAC;YACD,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC5B,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC5B,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;YAC5C,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,KAAK,gBAAgB,EAAE,CAAC;YACrC,wBAAwB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YAChB,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC;YACrB,MAAM,EAAE,CAAC;YACT,OAAO;QACT,CAAC;QAED,IAAI,SAAS,KAAK,oBAAoB,EAAE,CAAC;YACvC,KAAK,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC9B,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YAC1B,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAuB,EAAE,GAAW,EAAE,SAA6B;IAC7F,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAClC,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC;IACpC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACnC,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,iBAAiB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9B,MAAM,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IACD,IAAI,SAAS,KAAK,sBAAsB,EAAE,CAAC;QACzC,KAAK,CAAC,KAAK,GAAG,gBAAgB,CAAC;QAC/B,KAAK,CAAC,MAAM,GAAG,2BAA2B,CAAC;QAC3C,MAAM,EAAE,CAAC;QACT,KAAK,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,KAAK,aAAa,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACjC,MAAM,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACjC,MAAM,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACjC,MAAM,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IACD,IAAI,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAChC,MAAM,EAAE,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAuB,EAAE,GAAW;IACpE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAClC,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC;IACpC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACnB,MAAM,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,KAAK,EAAE,CAAC;YACV,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;QACD,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC5B,MAAM,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACvC,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,eAAe,CAAC,OAAO,EAAE,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,EAAE,CAAC;QACT,KAAK,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACvC,kBAAkB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,eAAe,CAAC,OAAO,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,EAAE,CAAC;QACT,KAAK,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,OAAO,CAAC,oBAAoB,GAAG,OAAO,KAAK,CAAC,EAAE,CAAC;gBACjD,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC;YACD,MAAM,EAAE,CAAC;YACT,KAAK,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;IACH,CAAC;IAED,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACvC,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC;YAC9B,MAAM,EAAE,CAAC;YACT,KAAK,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QACD,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC5B,MAAM,EAAE,CAAC;QACT,KAAK,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,sBAAsB,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;SAAM,IAAI,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC;QACxC,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,EAAE,CAAC;AACX,CAAC;AAED,SAAS,uBAAuB,CAAC,GAAW;IAC1C,OAAO,GAAG,KAAK,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,sBAAsB,CAAC,OAA8D;IAC5F,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAClE,OAAO,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAuB;IACpD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,OAAuB;IAClD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;QACvB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC;QAC1B,MAAM,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IAErF,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,MAAM,GAAG,WAAW,CAAC;IAC3B,MAAM,EAAE,CAAC;IAET,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,OAAQ,MAA8B,CAAC,KAAK,KAAK,QAAQ;YACtH,CAAC,CAAE,MAA4B,CAAC,KAAK;YACrC,CAAC,CAAC,SAAS,CAAC;QACd,KAAK,CAAC,aAAa,GAAG,SAAS,CAAC;QAChC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;QACnB,MAAM,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAClF,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACzB,MAAM,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QACnD,MAAM,EAAE,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,UAAU,GAAG,KAAK,CAAC;QAC3B,KAAK,CAAC,MAAM,GAAG,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAClF,MAAM,EAAE,CAAC;IACX,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,OAAuB;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC;IAC5C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,gBAAgB,EAAE,CAAC;QACzD,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,oBAAoB,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,qBAAqB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,gBAAgB,EAAE,CAAC;QAC7C,OAAO,CAAC,MAAM,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAuB;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC;IACpC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3F,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { RuntimeContext } from "./context.js";
2
+ export declare function handleAccountModal(context: RuntimeContext, key: string): void;
3
+ export declare function handleLoginModal(context: RuntimeContext, key: string): void;
4
+ export declare function handleConfirmModal(context: RuntimeContext, key: string): void;
5
+ export declare function openAccountOrLoginModal(context: RuntimeContext): void;
6
+ export declare function requestCacheCleanup(context: RuntimeContext): void;
7
+ export declare function requestLogout(context: RuntimeContext): void;
8
+ export declare function openComposeModal(context: RuntimeContext): void;
9
+ export declare function closeComposeModal(context: RuntimeContext): void;
10
+ export declare function closeEmotionPicker(context: RuntimeContext): void;
11
+ export declare function insertComposeText(context: RuntimeContext, value: string): void;
12
+ export declare function handleComposeBackspace(context: RuntimeContext): void;
13
+ export declare function moveComposeCursor(context: RuntimeContext, delta: number): void;
14
+ export declare function moveEmotionSidebar(context: RuntimeContext, delta: number): void;
15
+ export declare function moveEmotionGrid(context: RuntimeContext, delta: number): void;
16
+ export declare function checkUpdate(context: RuntimeContext): void;
17
+ //# sourceMappingURL=modals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modals.d.ts","sourceRoot":"","sources":["../../../src/tui/app-runtime/modals.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CA0C7E;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAkF3E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CA2E7E;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAerE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAYjE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAc3D;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAa9D;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAM/D;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAShE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAS9E;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAYpE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQ9E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQ/E;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAQ5E;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAWzD"}