@walavave/cc98-cli 0.1.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 (205) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -0
  3. package/dist/api/client.d.ts +57 -0
  4. package/dist/api/client.d.ts.map +1 -0
  5. package/dist/api/client.js +298 -0
  6. package/dist/api/client.js.map +1 -0
  7. package/dist/api/endpoints.d.ts +48 -0
  8. package/dist/api/endpoints.d.ts.map +1 -0
  9. package/dist/api/endpoints.js +53 -0
  10. package/dist/api/endpoints.js.map +1 -0
  11. package/dist/api/types.d.ts +35 -0
  12. package/dist/api/types.d.ts.map +1 -0
  13. package/dist/api/types.js +2 -0
  14. package/dist/api/types.js.map +1 -0
  15. package/dist/api/webvpn.d.ts +40 -0
  16. package/dist/api/webvpn.d.ts.map +1 -0
  17. package/dist/api/webvpn.js +259 -0
  18. package/dist/api/webvpn.js.map +1 -0
  19. package/dist/cli/commands/account.d.ts +2 -0
  20. package/dist/cli/commands/account.d.ts.map +1 -0
  21. package/dist/cli/commands/account.js +81 -0
  22. package/dist/cli/commands/account.js.map +1 -0
  23. package/dist/cli/commands/board.d.ts +2 -0
  24. package/dist/cli/commands/board.d.ts.map +1 -0
  25. package/dist/cli/commands/board.js +61 -0
  26. package/dist/cli/commands/board.js.map +1 -0
  27. package/dist/cli/commands/cache.d.ts +2 -0
  28. package/dist/cli/commands/cache.d.ts.map +1 -0
  29. package/dist/cli/commands/cache.js +68 -0
  30. package/dist/cli/commands/cache.js.map +1 -0
  31. package/dist/cli/commands/forum.d.ts +2 -0
  32. package/dist/cli/commands/forum.d.ts.map +1 -0
  33. package/dist/cli/commands/forum.js +38 -0
  34. package/dist/cli/commands/forum.js.map +1 -0
  35. package/dist/cli/commands/login.d.ts +2 -0
  36. package/dist/cli/commands/login.d.ts.map +1 -0
  37. package/dist/cli/commands/login.js +98 -0
  38. package/dist/cli/commands/login.js.map +1 -0
  39. package/dist/cli/commands/logout.d.ts +2 -0
  40. package/dist/cli/commands/logout.d.ts.map +1 -0
  41. package/dist/cli/commands/logout.js +20 -0
  42. package/dist/cli/commands/logout.js.map +1 -0
  43. package/dist/cli/commands/me.d.ts +2 -0
  44. package/dist/cli/commands/me.d.ts.map +1 -0
  45. package/dist/cli/commands/me.js +9 -0
  46. package/dist/cli/commands/me.js.map +1 -0
  47. package/dist/cli/commands/message.d.ts +2 -0
  48. package/dist/cli/commands/message.d.ts.map +1 -0
  49. package/dist/cli/commands/message.js +42 -0
  50. package/dist/cli/commands/message.js.map +1 -0
  51. package/dist/cli/commands/notice.d.ts +2 -0
  52. package/dist/cli/commands/notice.d.ts.map +1 -0
  53. package/dist/cli/commands/notice.js +30 -0
  54. package/dist/cli/commands/notice.js.map +1 -0
  55. package/dist/cli/commands/post.d.ts +2 -0
  56. package/dist/cli/commands/post.d.ts.map +1 -0
  57. package/dist/cli/commands/post.js +37 -0
  58. package/dist/cli/commands/post.js.map +1 -0
  59. package/dist/cli/commands/search.d.ts +2 -0
  60. package/dist/cli/commands/search.d.ts.map +1 -0
  61. package/dist/cli/commands/search.js +13 -0
  62. package/dist/cli/commands/search.js.map +1 -0
  63. package/dist/cli/commands/topic.d.ts +2 -0
  64. package/dist/cli/commands/topic.d.ts.map +1 -0
  65. package/dist/cli/commands/topic.js +196 -0
  66. package/dist/cli/commands/topic.js.map +1 -0
  67. package/dist/cli/commands/update.d.ts +2 -0
  68. package/dist/cli/commands/update.d.ts.map +1 -0
  69. package/dist/cli/commands/update.js +24 -0
  70. package/dist/cli/commands/update.js.map +1 -0
  71. package/dist/cli/commands/user.d.ts +2 -0
  72. package/dist/cli/commands/user.d.ts.map +1 -0
  73. package/dist/cli/commands/user.js +90 -0
  74. package/dist/cli/commands/user.js.map +1 -0
  75. package/dist/cli/commands/vpn.d.ts +2 -0
  76. package/dist/cli/commands/vpn.d.ts.map +1 -0
  77. package/dist/cli/commands/vpn.js +177 -0
  78. package/dist/cli/commands/vpn.js.map +1 -0
  79. package/dist/cli/context.d.ts +9 -0
  80. package/dist/cli/context.d.ts.map +1 -0
  81. package/dist/cli/context.js +26 -0
  82. package/dist/cli/context.js.map +1 -0
  83. package/dist/cli/options.d.ts +6 -0
  84. package/dist/cli/options.d.ts.map +1 -0
  85. package/dist/cli/options.js +22 -0
  86. package/dist/cli/options.js.map +1 -0
  87. package/dist/cli/parse.d.ts +15 -0
  88. package/dist/cli/parse.d.ts.map +1 -0
  89. package/dist/cli/parse.js +55 -0
  90. package/dist/cli/parse.js.map +1 -0
  91. package/dist/cli/prompt.d.ts +4 -0
  92. package/dist/cli/prompt.d.ts.map +1 -0
  93. package/dist/cli/prompt.js +53 -0
  94. package/dist/cli/prompt.js.map +1 -0
  95. package/dist/cli/router.d.ts +2 -0
  96. package/dist/cli/router.d.ts.map +1 -0
  97. package/dist/cli/router.js +90 -0
  98. package/dist/cli/router.js.map +1 -0
  99. package/dist/config.d.ts +10 -0
  100. package/dist/config.d.ts.map +1 -0
  101. package/dist/config.js +74 -0
  102. package/dist/config.js.map +1 -0
  103. package/dist/main.d.ts +3 -0
  104. package/dist/main.d.ts.map +1 -0
  105. package/dist/main.js +17 -0
  106. package/dist/main.js.map +1 -0
  107. package/dist/storage/cache-store.d.ts +62 -0
  108. package/dist/storage/cache-store.d.ts.map +1 -0
  109. package/dist/storage/cache-store.js +233 -0
  110. package/dist/storage/cache-store.js.map +1 -0
  111. package/dist/storage/paths.d.ts +5 -0
  112. package/dist/storage/paths.d.ts.map +1 -0
  113. package/dist/storage/paths.js +17 -0
  114. package/dist/storage/paths.js.map +1 -0
  115. package/dist/storage/token-store.d.ts +39 -0
  116. package/dist/storage/token-store.d.ts.map +1 -0
  117. package/dist/storage/token-store.js +177 -0
  118. package/dist/storage/token-store.js.map +1 -0
  119. package/dist/storage/vpn-store.d.ts +16 -0
  120. package/dist/storage/vpn-store.d.ts.map +1 -0
  121. package/dist/storage/vpn-store.js +72 -0
  122. package/dist/storage/vpn-store.js.map +1 -0
  123. package/dist/tui/account-modal.d.ts +31 -0
  124. package/dist/tui/account-modal.d.ts.map +1 -0
  125. package/dist/tui/account-modal.js +97 -0
  126. package/dist/tui/account-modal.js.map +1 -0
  127. package/dist/tui/ansi.d.ts +20 -0
  128. package/dist/tui/ansi.d.ts.map +1 -0
  129. package/dist/tui/ansi.js +28 -0
  130. package/dist/tui/ansi.js.map +1 -0
  131. package/dist/tui/app-data.d.ts +22 -0
  132. package/dist/tui/app-data.d.ts.map +1 -0
  133. package/dist/tui/app-data.js +828 -0
  134. package/dist/tui/app-data.js.map +1 -0
  135. package/dist/tui/app-runtime.d.ts +27 -0
  136. package/dist/tui/app-runtime.d.ts.map +1 -0
  137. package/dist/tui/app-runtime.js +874 -0
  138. package/dist/tui/app-runtime.js.map +1 -0
  139. package/dist/tui/app.d.ts +2 -0
  140. package/dist/tui/app.d.ts.map +1 -0
  141. package/dist/tui/app.js +172 -0
  142. package/dist/tui/app.js.map +1 -0
  143. package/dist/tui/cached-client.d.ts +41 -0
  144. package/dist/tui/cached-client.d.ts.map +1 -0
  145. package/dist/tui/cached-client.js +78 -0
  146. package/dist/tui/cached-client.js.map +1 -0
  147. package/dist/tui/canvas.d.ts +26 -0
  148. package/dist/tui/canvas.d.ts.map +1 -0
  149. package/dist/tui/canvas.js +204 -0
  150. package/dist/tui/canvas.js.map +1 -0
  151. package/dist/tui/downloads.d.ts +2 -0
  152. package/dist/tui/downloads.d.ts.map +1 -0
  153. package/dist/tui/downloads.js +81 -0
  154. package/dist/tui/downloads.js.map +1 -0
  155. package/dist/tui/image-preview.d.ts +19 -0
  156. package/dist/tui/image-preview.d.ts.map +1 -0
  157. package/dist/tui/image-preview.js +217 -0
  158. package/dist/tui/image-preview.js.map +1 -0
  159. package/dist/tui/interactions.d.ts +5 -0
  160. package/dist/tui/interactions.d.ts.map +1 -0
  161. package/dist/tui/interactions.js +25 -0
  162. package/dist/tui/interactions.js.map +1 -0
  163. package/dist/tui/keymap.d.ts +7 -0
  164. package/dist/tui/keymap.d.ts.map +1 -0
  165. package/dist/tui/keymap.js +262 -0
  166. package/dist/tui/keymap.js.map +1 -0
  167. package/dist/tui/layout.d.ts +29 -0
  168. package/dist/tui/layout.d.ts.map +1 -0
  169. package/dist/tui/layout.js +82 -0
  170. package/dist/tui/layout.js.map +1 -0
  171. package/dist/tui/renderer.d.ts +9 -0
  172. package/dist/tui/renderer.d.ts.map +1 -0
  173. package/dist/tui/renderer.js +375 -0
  174. package/dist/tui/renderer.js.map +1 -0
  175. package/dist/tui/terminal.d.ts +41 -0
  176. package/dist/tui/terminal.d.ts.map +1 -0
  177. package/dist/tui/terminal.js +162 -0
  178. package/dist/tui/terminal.js.map +1 -0
  179. package/dist/tui/text.d.ts +10 -0
  180. package/dist/tui/text.d.ts.map +1 -0
  181. package/dist/tui/text.js +158 -0
  182. package/dist/tui/text.js.map +1 -0
  183. package/dist/tui/theme.d.ts +56 -0
  184. package/dist/tui/theme.d.ts.map +1 -0
  185. package/dist/tui/theme.js +95 -0
  186. package/dist/tui/theme.js.map +1 -0
  187. package/dist/tui/tui-model.d.ts +126 -0
  188. package/dist/tui/tui-model.d.ts.map +1 -0
  189. package/dist/tui/tui-model.js +54 -0
  190. package/dist/tui/tui-model.js.map +1 -0
  191. package/dist/tui/ubb-renderer.d.ts +12 -0
  192. package/dist/tui/ubb-renderer.d.ts.map +1 -0
  193. package/dist/tui/ubb-renderer.js +196 -0
  194. package/dist/tui/ubb-renderer.js.map +1 -0
  195. package/dist/update.d.ts +17 -0
  196. package/dist/update.d.ts.map +1 -0
  197. package/dist/update.js +88 -0
  198. package/dist/update.js.map +1 -0
  199. package/dist/version.d.ts +6 -0
  200. package/dist/version.d.ts.map +1 -0
  201. package/dist/version.js +6 -0
  202. package/dist/version.js.map +1 -0
  203. package/docs/images/tui.png +0 -0
  204. package/docs/images/tui2.png +0 -0
  205. package/package.json +43 -0
@@ -0,0 +1,158 @@
1
+ import { stripAnsi } from "./ansi.js";
2
+ const segmenter = typeof Intl !== "undefined" && "Segmenter" in Intl
3
+ ? new Intl.Segmenter(undefined, { granularity: "grapheme" })
4
+ : undefined;
5
+ export function blank(count, width) {
6
+ return Array.from({ length: Math.max(0, count) }, () => " ".repeat(Math.max(0, width)));
7
+ }
8
+ export function fit(value, width) {
9
+ const safeWidth = Math.max(0, width);
10
+ const truncated = truncate(value, safeWidth);
11
+ return `${truncated}${" ".repeat(Math.max(0, safeWidth - cellWidth(truncated)))}`;
12
+ }
13
+ export function truncate(value, width) {
14
+ const safeWidth = Math.max(0, width);
15
+ let out = "";
16
+ let used = 0;
17
+ let inEscape = false;
18
+ for (let index = 0; index < value.length; index += 1) {
19
+ const char = value[index];
20
+ if (char === "\x1b") {
21
+ inEscape = true;
22
+ out += char;
23
+ continue;
24
+ }
25
+ if (inEscape) {
26
+ out += char;
27
+ if (/[A-Za-z]/.test(char)) {
28
+ inEscape = false;
29
+ }
30
+ continue;
31
+ }
32
+ const plainStart = index;
33
+ const cluster = nextCluster(value, index);
34
+ const clusterWidth = cellWidth(cluster);
35
+ if (used + clusterWidth > safeWidth) {
36
+ break;
37
+ }
38
+ out += cluster;
39
+ used += clusterWidth;
40
+ index = plainStart + cluster.length - 1;
41
+ }
42
+ return out;
43
+ }
44
+ export function wrapText(text, maxWidth) {
45
+ const width = Math.max(1, maxWidth);
46
+ const lines = [];
47
+ let current = "";
48
+ let currentWidth = 0;
49
+ for (const cluster of graphemes(text)) {
50
+ const clusterWidth = cellWidth(cluster);
51
+ if (currentWidth + clusterWidth > width) {
52
+ lines.push(current);
53
+ current = cluster;
54
+ currentWidth = clusterWidth;
55
+ }
56
+ else {
57
+ current += cluster;
58
+ currentWidth += clusterWidth;
59
+ }
60
+ }
61
+ if (current) {
62
+ lines.push(current);
63
+ }
64
+ return lines;
65
+ }
66
+ export function cellWidth(value) {
67
+ let width = 0;
68
+ for (const cluster of graphemes(stripAnsi(value))) {
69
+ width += clusterCellWidth(cluster);
70
+ }
71
+ return width;
72
+ }
73
+ export function sliceCells(value, start, width) {
74
+ const plain = stripAnsi(value);
75
+ const targetStart = Math.max(0, start);
76
+ const targetWidth = Math.max(0, width);
77
+ let result = "";
78
+ let used = 0;
79
+ let resultWidth = 0;
80
+ for (const cluster of graphemes(plain)) {
81
+ const clusterWidth = clusterCellWidth(cluster);
82
+ if (used + clusterWidth <= targetStart) {
83
+ used += clusterWidth;
84
+ continue;
85
+ }
86
+ if (resultWidth + clusterWidth > targetWidth) {
87
+ break;
88
+ }
89
+ result += cluster;
90
+ resultWidth += clusterWidth;
91
+ used += clusterWidth;
92
+ }
93
+ return result;
94
+ }
95
+ export function graphemes(value) {
96
+ if (!value) {
97
+ return [];
98
+ }
99
+ if (segmenter) {
100
+ return Array.from(segmenter.segment(value), (part) => part.segment);
101
+ }
102
+ return Array.from(value);
103
+ }
104
+ export function clusterCellWidth(value) {
105
+ if (!value) {
106
+ return 0;
107
+ }
108
+ if (isZeroWidthCluster(value)) {
109
+ return 0;
110
+ }
111
+ if (isEmojiCluster(value)) {
112
+ return 2;
113
+ }
114
+ let width = 0;
115
+ for (const char of Array.from(value)) {
116
+ width += charCellWidth(char);
117
+ }
118
+ return Math.max(1, width);
119
+ }
120
+ function nextCluster(value, index) {
121
+ const rest = value.slice(index);
122
+ return graphemes(rest)[0] ?? value[index] ?? "";
123
+ }
124
+ function isZeroWidthCluster(value) {
125
+ return /^[\u200d\ufe0e\ufe0f\p{Mark}]+$/u.test(value);
126
+ }
127
+ function isEmojiCluster(value) {
128
+ for (const char of Array.from(value)) {
129
+ const code = char.codePointAt(0) ?? 0;
130
+ if ((code >= 0x1f000 && code <= 0x1faff) ||
131
+ (code >= 0x2600 && code <= 0x27bf) ||
132
+ (code >= 0x2300 && code <= 0x23ff)) {
133
+ return true;
134
+ }
135
+ }
136
+ return /\p{Extended_Pictographic}/u.test(value) || /\p{Emoji_Presentation}/u.test(value);
137
+ }
138
+ export function charCellWidth(char) {
139
+ const code = char.codePointAt(0) ?? 0;
140
+ if (code === 0) {
141
+ return 0;
142
+ }
143
+ if (code >= 0x1100 &&
144
+ (code <= 0x115f ||
145
+ code === 0x2329 ||
146
+ code === 0x232a ||
147
+ (code >= 0x2e80 && code <= 0xa4cf) ||
148
+ (code >= 0xac00 && code <= 0xd7a3) ||
149
+ (code >= 0xf900 && code <= 0xfaff) ||
150
+ (code >= 0xfe10 && code <= 0xfe19) ||
151
+ (code >= 0xfe30 && code <= 0xfe6f) ||
152
+ (code >= 0xff00 && code <= 0xff60) ||
153
+ (code >= 0xffe0 && code <= 0xffe6))) {
154
+ return 2;
155
+ }
156
+ return 1;
157
+ }
158
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/tui/text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ export declare const theme: {
2
+ readonly color: {
3
+ readonly primary: string;
4
+ readonly primarySoft: string;
5
+ readonly primaryBg: string;
6
+ readonly panelBg: string;
7
+ readonly selectedBg: string;
8
+ readonly textOnPrimary: string;
9
+ readonly muted: string;
10
+ readonly rule: string;
11
+ readonly notice: string;
12
+ readonly danger: string;
13
+ readonly ok: string;
14
+ };
15
+ readonly border: {
16
+ readonly horizontal: "─";
17
+ readonly vertical: "│";
18
+ readonly topLeft: "╭";
19
+ readonly topRight: "╮";
20
+ readonly bottomLeft: "╰";
21
+ readonly bottomRight: "╯";
22
+ readonly teeLeft: "├";
23
+ readonly teeRight: "┤";
24
+ readonly teeTop: "┬";
25
+ readonly teeBottom: "┴";
26
+ readonly cross: "┼";
27
+ };
28
+ readonly marker: {
29
+ readonly selected: "●";
30
+ readonly normal: "•";
31
+ readonly pointer: "›";
32
+ };
33
+ readonly quote: {
34
+ readonly prefix: "│ ";
35
+ };
36
+ };
37
+ export declare function styled(content: string, style: string): string;
38
+ export declare const textStyle: {
39
+ readonly primary: (content: string) => string;
40
+ readonly primaryBold: (content: string) => string;
41
+ readonly primarySoft: (content: string) => string;
42
+ readonly primarySoftBold: (content: string) => string;
43
+ readonly primaryBar: (content: string) => string;
44
+ readonly muted: (content: string) => string;
45
+ readonly notice: (content: string) => string;
46
+ readonly noticeBold: (content: string) => string;
47
+ readonly danger: (content: string) => string;
48
+ readonly dangerBold: (content: string) => string;
49
+ readonly ok: (content: string) => string;
50
+ readonly onPrimary: (content: string) => string;
51
+ readonly rule: (content: string) => string;
52
+ };
53
+ export declare function selectedLine(content: string, width: number, focused?: boolean): string;
54
+ export declare function panelLine(content: string, width: number): string;
55
+ export declare function ruleLine(width: number): string;
56
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCR,CAAC;AAEX,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,eAAO,MAAM,SAAS;gCACH,MAAM,KAAG,MAAM;oCAGX,MAAM,KAAG,MAAM;oCAGf,MAAM,KAAG,MAAM;wCAGX,MAAM,KAAG,MAAM;mCAGpB,MAAM,KAAG,MAAM;8BAGpB,MAAM,KAAG,MAAM;+BAGd,MAAM,KAAG,MAAM;mCAGX,MAAM,KAAG,MAAM;+BAGnB,MAAM,KAAG,MAAM;mCAGX,MAAM,KAAG,MAAM;2BAGvB,MAAM,KAAG,MAAM;kCAGR,MAAM,KAAG,MAAM;6BAGpB,MAAM,KAAG,MAAM;CAGrB,CAAC;AAEX,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,UAAO,GAAG,MAAM,CAKnF;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9C"}
@@ -0,0 +1,95 @@
1
+ import { ansi, bg, fg } from "./ansi.js";
2
+ import { fit } from "./text.js";
3
+ export const theme = {
4
+ color: {
5
+ primary: fg(0, 130, 202),
6
+ primarySoft: fg(94, 180, 232),
7
+ primaryBg: bg(0, 104, 176),
8
+ panelBg: bg(5, 46, 74),
9
+ selectedBg: bg(181, 196, 255),
10
+ textOnPrimary: fg(245, 250, 255),
11
+ muted: fg(139, 152, 166),
12
+ rule: fg(181, 196, 255),
13
+ notice: fg(245, 101, 101),
14
+ danger: fg(245, 101, 101),
15
+ ok: fg(91, 207, 140)
16
+ },
17
+ border: {
18
+ horizontal: "─",
19
+ vertical: "│",
20
+ topLeft: "╭",
21
+ topRight: "╮",
22
+ bottomLeft: "╰",
23
+ bottomRight: "╯",
24
+ teeLeft: "├",
25
+ teeRight: "┤",
26
+ teeTop: "┬",
27
+ teeBottom: "┴",
28
+ cross: "┼"
29
+ },
30
+ marker: {
31
+ selected: "●",
32
+ normal: "•",
33
+ pointer: "›"
34
+ },
35
+ quote: {
36
+ prefix: "│ "
37
+ }
38
+ };
39
+ export function styled(content, style) {
40
+ return `${style}${content}${ansi.reset}`;
41
+ }
42
+ export const textStyle = {
43
+ primary(content) {
44
+ return styled(content, theme.color.primary);
45
+ },
46
+ primaryBold(content) {
47
+ return styled(content, `${theme.color.primary}${ansi.bold}`);
48
+ },
49
+ primarySoft(content) {
50
+ return styled(content, theme.color.primarySoft);
51
+ },
52
+ primarySoftBold(content) {
53
+ return styled(content, `${theme.color.primarySoft}${ansi.bold}`);
54
+ },
55
+ primaryBar(content) {
56
+ return styled(content, `${theme.color.primaryBg}${theme.color.textOnPrimary}${ansi.bold}`);
57
+ },
58
+ muted(content) {
59
+ return styled(content, theme.color.muted);
60
+ },
61
+ notice(content) {
62
+ return styled(content, theme.color.notice);
63
+ },
64
+ noticeBold(content) {
65
+ return styled(content, `${theme.color.notice}${ansi.bold}`);
66
+ },
67
+ danger(content) {
68
+ return styled(content, theme.color.danger);
69
+ },
70
+ dangerBold(content) {
71
+ return styled(content, `${theme.color.danger}${ansi.bold}`);
72
+ },
73
+ ok(content) {
74
+ return styled(content, theme.color.ok);
75
+ },
76
+ onPrimary(content) {
77
+ return styled(content, theme.color.textOnPrimary);
78
+ },
79
+ rule(content) {
80
+ return styled(content, theme.color.rule);
81
+ }
82
+ };
83
+ export function selectedLine(content, width, focused = true) {
84
+ if (!focused) {
85
+ return textStyle.primarySoft(fit(content, width));
86
+ }
87
+ return styled(fit(content, width), theme.color.selectedBg);
88
+ }
89
+ export function panelLine(content, width) {
90
+ return styled(fit(content, width), theme.color.panelBg);
91
+ }
92
+ export function ruleLine(width) {
93
+ return textStyle.rule(theme.border.horizontal.repeat(Math.max(0, width)));
94
+ }
95
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/tui/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ import type { AccountModalState, ConfirmDialogState, LoginFormState } from "./account-modal.js";
2
+ export type ViewId = "hot" | "new" | "boards" | "following" | "favorite" | "messages" | "me" | "settings";
3
+ export type FocusColumn = "nav" | "content";
4
+ export type ModalType = "help" | "account" | "login" | "confirm" | "image" | null;
5
+ export interface NavItem {
6
+ id: ViewId;
7
+ label: string;
8
+ hint: string;
9
+ }
10
+ export interface ContentItem {
11
+ title: string;
12
+ meta?: string;
13
+ detail?: string;
14
+ topicId?: number;
15
+ boardId?: number;
16
+ chatUserId?: number;
17
+ sortTime?: number;
18
+ }
19
+ export interface TuiState {
20
+ mode: "list" | "topic" | "settings";
21
+ focus: FocusColumn;
22
+ navIndex: number;
23
+ itemIndex: number;
24
+ scroll: number;
25
+ sidebarWidth?: number;
26
+ draggingSidebarDivider: boolean;
27
+ loading: boolean;
28
+ loadingMore: boolean;
29
+ status: string;
30
+ notification?: {
31
+ message: string;
32
+ expiresAt: number;
33
+ };
34
+ error?: string;
35
+ account?: string;
36
+ viewTitle: string;
37
+ items: ContentItem[];
38
+ overview: ContentItem[];
39
+ parentList?: ListSnapshot;
40
+ currentBoard?: BoardListState;
41
+ currentChat?: ChatListState;
42
+ topic?: TopicReaderState;
43
+ modal: ModalType;
44
+ accountModal: AccountModalState;
45
+ loginForm: LoginFormState;
46
+ confirmDialog?: ConfirmDialogState;
47
+ imageViewer?: ImageViewerState;
48
+ }
49
+ export interface ListSnapshot {
50
+ title: string;
51
+ items: ContentItem[];
52
+ itemIndex: number;
53
+ status: string;
54
+ }
55
+ export interface BoardListState {
56
+ boardId: number;
57
+ title: string;
58
+ }
59
+ export interface ChatListState {
60
+ userId: number;
61
+ title: string;
62
+ loaded: number;
63
+ size: number;
64
+ hasMore: boolean;
65
+ }
66
+ export interface TopicReaderState {
67
+ topicId: number;
68
+ title: string;
69
+ meta: string;
70
+ lines: string[];
71
+ posts: TopicPostEntry[];
72
+ loaded: number;
73
+ size: number;
74
+ hasMore: boolean;
75
+ imageCount: number;
76
+ linkCount: number;
77
+ floorInput: string;
78
+ }
79
+ export interface ImageViewerState {
80
+ images: string[];
81
+ index: number;
82
+ token?: string;
83
+ renderSize?: {
84
+ columns: number;
85
+ rows: number;
86
+ };
87
+ loading: boolean;
88
+ error?: string;
89
+ }
90
+ export interface TopicPostEntry {
91
+ id?: number;
92
+ floor?: number;
93
+ author: string;
94
+ time: string;
95
+ likeCount: number;
96
+ dislikeCount: number;
97
+ rating?: string;
98
+ preview: string;
99
+ lineStart: number;
100
+ lineEnd: number;
101
+ imageCount: number;
102
+ linkCount: number;
103
+ images: string[];
104
+ links: string[];
105
+ lines: TopicLineEntry[];
106
+ }
107
+ export interface TopicLineEntry {
108
+ line: number;
109
+ row: number;
110
+ floor?: number;
111
+ kind: "header" | "divider" | "text" | "quote" | "image" | "link" | "blank";
112
+ text: string;
113
+ imageIndex?: number;
114
+ imageUrl?: string;
115
+ imagePreview?: string;
116
+ imagePreviewRows?: number;
117
+ imageBlockRows?: number;
118
+ linkIndex?: number;
119
+ linkUrl?: string;
120
+ }
121
+ export declare const navItems: NavItem[];
122
+ export declare const settingsItems: ContentItem[];
123
+ export declare function currentTopicPost(topic: TopicReaderState, scroll: number): TopicPostEntry | undefined;
124
+ export declare function currentTopicLine(topic: TopicReaderState, scroll: number): TopicLineEntry | undefined;
125
+ export declare function getStatus(state: TuiState): string;
126
+ //# sourceMappingURL=tui-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-model.d.ts","sourceRoot":"","sources":["../../src/tui/tui-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ export const navItems = [
2
+ { id: "hot", label: "十大", hint: "热门话题" },
3
+ { id: "favorite", label: "收藏", hint: "版面帖子" },
4
+ { id: "new", label: "最新", hint: "新帖流" },
5
+ { id: "boards", label: "版面", hint: "所有分区" },
6
+ { id: "following", label: "关注", hint: "用户动态" },
7
+ { id: "messages", label: "消息", hint: "未读与私信" },
8
+ { id: "me", label: "我的", hint: "当前账号" },
9
+ { id: "settings", label: "设置", hint: "账号与配置" }
10
+ ];
11
+ export const settingsItems = [
12
+ { title: "切换账号", meta: "account", detail: "选择或管理登录账号" },
13
+ { title: "检查更新", meta: "update", detail: "检查 CC98-CLI 新版本" },
14
+ { title: "缓存管理", meta: "cache", detail: "查看和清理本地缓存" },
15
+ { title: "快捷键帮助", meta: "help", detail: "查看所有可用快捷键" },
16
+ { title: "退出登录", meta: "logout", detail: "清除本地登录信息" }
17
+ ];
18
+ export function currentTopicPost(topic, scroll) {
19
+ return topic.posts.find((entry) => scroll >= entry.lineStart && scroll <= entry.lineEnd) ??
20
+ [...topic.posts].reverse().find((entry) => entry.lineStart <= scroll) ??
21
+ topic.posts[0];
22
+ }
23
+ export function currentTopicLine(topic, scroll) {
24
+ const post = currentTopicPost(topic, scroll);
25
+ if (!post) {
26
+ return undefined;
27
+ }
28
+ return post.lines.find((entry) => entry.line === scroll) ??
29
+ post.lines.find((entry) => entry.line > scroll && entry.kind !== "blank") ??
30
+ post.lines.at(-1);
31
+ }
32
+ export function getStatus(state) {
33
+ if (state.loading) {
34
+ return "加载中...";
35
+ }
36
+ if (state.loadingMore) {
37
+ return "加载更多...";
38
+ }
39
+ if (state.error) {
40
+ return "出错了";
41
+ }
42
+ if (state.mode === "topic" && state.topic) {
43
+ const post = currentTopicPost(state.topic, state.scroll);
44
+ const line = currentTopicLine(state.topic, state.scroll);
45
+ return post
46
+ ? `${post.floor ?? "?"} 楼 · 第 ${line ? line.row + 1 : 1} 行`
47
+ : `${state.topic.loaded} 楼已加载`;
48
+ }
49
+ if (state.mode === "settings") {
50
+ return "设置";
51
+ }
52
+ return `${state.items.length} 项`;
53
+ }
54
+ //# sourceMappingURL=tui-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-model.js","sourceRoot":"","sources":["../../src/tui/tui-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface RenderedPost {
2
+ lines: string[];
3
+ images: string[];
4
+ links: string[];
5
+ }
6
+ interface RenderOptions {
7
+ imagePreviewRows?: number;
8
+ }
9
+ export declare function renderUbbToLines(content: string, width: number, options?: RenderOptions): RenderedPost;
10
+ export declare function renderMarkdownToLines(content: string, width: number, options?: RenderOptions): RenderedPost;
11
+ export {};
12
+ //# sourceMappingURL=ubb-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ubb-renderer.d.ts","sourceRoot":"","sources":["../../src/tui/ubb-renderer.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,UAAU,aAAa;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY,CA0D1G;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY,CA+C/G"}