@nbtca/prompt 1.0.13 → 1.0.15

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.
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * Minimalist menu system
3
- * Six core feature menus
3
+ * Modern @clack/prompts select() with emoji icons and hint text
4
4
  */
5
5
  export type MenuAction = 'events' | 'repair' | 'docs' | 'website' | 'github' | 'roadmap' | 'about' | 'language';
6
6
  /**
7
- * Display main menu
7
+ * Display main menu — loops until user exits via Ctrl+C
8
8
  */
9
9
  export declare function showMainMenu(): Promise<void>;
10
10
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/core/menu.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAyDhH;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA4ClD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCrE"}
1
+ {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../src/core/menu.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAmBhH;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAoBlD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAWrE"}
package/dist/core/menu.js CHANGED
@@ -1,112 +1,50 @@
1
1
  /**
2
2
  * Minimalist menu system
3
- * Six core feature menus
3
+ * Modern @clack/prompts select() with emoji icons and hint text
4
4
  */
5
- import inquirer from 'inquirer';
5
+ import { select, isCancel, outro, note } from '@clack/prompts';
6
6
  import chalk from 'chalk';
7
7
  import { showCalendar } from '../features/calendar.js';
8
8
  import { openRepairService } from '../features/repair.js';
9
9
  import { showDocsMenu } from '../features/docs.js';
10
10
  import { openHomepage, openGithub, openRoadmap } from '../features/website.js';
11
- import { printDivider, printNewLine } from './ui.js';
11
+ import { printDivider, printNewLine, success } from './ui.js';
12
12
  import { APP_INFO, URLS } from '../config/data.js';
13
13
  import { t, getCurrentLanguage, setLanguage, clearTranslationCache } from '../i18n/index.js';
14
14
  /**
15
- * Get main menu options
15
+ * Get main menu options with emoji icons and hint text
16
16
  */
17
17
  function getMainMenuOptions() {
18
18
  const trans = t();
19
19
  return [
20
- {
21
- name: '[*] ' + trans.menu.events.padEnd(16) + ' ' + chalk.gray(trans.menu.eventsDesc),
22
- value: 'events',
23
- short: trans.menu.events
24
- },
25
- {
26
- name: '[*] ' + trans.menu.repair.padEnd(16) + ' ' + chalk.gray(trans.menu.repairDesc),
27
- value: 'repair',
28
- short: trans.menu.repair
29
- },
30
- {
31
- name: '[*] ' + trans.menu.docs.padEnd(16) + ' ' + chalk.gray(trans.menu.docsDesc),
32
- value: 'docs',
33
- short: trans.menu.docs
34
- },
35
- {
36
- name: '[*] ' + trans.menu.website.padEnd(16) + ' ' + chalk.gray(trans.menu.websiteDesc),
37
- value: 'website',
38
- short: trans.menu.website
39
- },
40
- {
41
- name: '[*] ' + trans.menu.github.padEnd(16) + ' ' + chalk.gray(trans.menu.githubDesc),
42
- value: 'github',
43
- short: trans.menu.github
44
- },
45
- {
46
- name: '[*] ' + trans.menu.roadmap.padEnd(16) + ' ' + chalk.gray(trans.menu.roadmapDesc),
47
- value: 'roadmap',
48
- short: trans.menu.roadmap
49
- },
50
- {
51
- name: '[?] ' + trans.menu.about.padEnd(16) + ' ' + chalk.gray(trans.menu.aboutDesc),
52
- value: 'about',
53
- short: trans.menu.about
54
- },
55
- {
56
- name: '[⚙] ' + trans.menu.language.padEnd(16) + ' ' + chalk.gray(trans.menu.languageDesc),
57
- value: 'language',
58
- short: trans.menu.language
59
- },
60
- new inquirer.Separator(' '),
61
- {
62
- name: chalk.dim('[x] ' + trans.common.exit),
63
- value: 'exit',
64
- short: trans.common.exit
65
- }
20
+ { value: 'events', label: '🗓 ' + trans.menu.events, hint: trans.menu.eventsDesc },
21
+ { value: 'repair', label: '🔧 ' + trans.menu.repair, hint: trans.menu.repairDesc },
22
+ { value: 'docs', label: '📚 ' + trans.menu.docs, hint: trans.menu.docsDesc },
23
+ { value: 'website', label: '🌐 ' + trans.menu.website, hint: trans.menu.websiteDesc },
24
+ { value: 'github', label: '🐙 ' + trans.menu.github, hint: trans.menu.githubDesc },
25
+ { value: 'roadmap', label: '🗺 ' + trans.menu.roadmap, hint: trans.menu.roadmapDesc },
26
+ { value: 'about', label: 'ℹ️ ' + trans.menu.about, hint: trans.menu.aboutDesc },
27
+ { value: 'language', label: '🌍 ' + trans.menu.language, hint: trans.menu.languageDesc },
66
28
  ];
67
29
  }
68
30
  /**
69
- * Display main menu
31
+ * Display main menu — loops until user exits via Ctrl+C
70
32
  */
71
33
  export async function showMainMenu() {
72
34
  while (true) {
73
- try {
74
- const trans = t();
75
- // Show keybinding hints
76
- console.log(chalk.dim(' ' + trans.menu.navigationHint));
77
- console.log(chalk.dim(' ' + trans.menu.quickCommandHint));
78
- console.log();
79
- const { action } = await inquirer.prompt([
80
- {
81
- type: 'list',
82
- name: 'action',
83
- message: trans.menu.chooseAction,
84
- choices: getMainMenuOptions(),
85
- pageSize: 15,
86
- loop: false
87
- }
88
- ]);
89
- // Handle user selection
90
- if (action === 'exit') {
91
- console.log();
92
- console.log(chalk.dim(trans.common.goodbye));
93
- process.exit(0);
94
- }
95
- await runMenuAction(action);
96
- // Show divider after operation
97
- printNewLine();
98
- printDivider();
99
- printNewLine();
100
- }
101
- catch (err) {
102
- // Handle Ctrl+C exit
103
- if (err.message?.includes('User force closed')) {
104
- console.log();
105
- console.log(chalk.dim(t().common.goodbye));
106
- process.exit(0);
107
- }
108
- throw err;
35
+ const trans = t();
36
+ const action = await select({
37
+ message: trans.menu.chooseAction,
38
+ options: getMainMenuOptions(),
39
+ });
40
+ if (isCancel(action)) {
41
+ outro(chalk.dim(t().common.goodbye));
42
+ process.exit(0);
109
43
  }
44
+ await runMenuAction(action);
45
+ printNewLine();
46
+ printDivider();
47
+ printNewLine();
110
48
  }
111
49
  }
112
50
  /**
@@ -141,30 +79,29 @@ export async function runMenuAction(action) {
141
79
  }
142
80
  }
143
81
  /**
144
- * Display about information
82
+ * Display about information using clack note() box
145
83
  */
146
84
  function showAbout() {
147
85
  const trans = t();
148
- console.log();
149
- console.log(chalk.bold('>> ' + trans.about.title));
150
- console.log();
151
- console.log(chalk.dim(trans.about.project.padEnd(12)) + APP_INFO.name);
152
- console.log(chalk.dim(trans.about.version.padEnd(12)) + `v${APP_INFO.version}`);
153
- console.log(chalk.dim(trans.about.description.padEnd(12)) + APP_INFO.fullDescription);
154
- console.log();
155
- console.log(chalk.dim(trans.about.github.padEnd(12)) + chalk.cyan(APP_INFO.repository));
156
- console.log(chalk.dim(trans.about.website.padEnd(12)) + chalk.cyan(URLS.homepage));
157
- console.log(chalk.dim(trans.about.email.padEnd(12)) + chalk.cyan(URLS.email));
158
- console.log();
159
- console.log(chalk.dim(trans.about.features));
160
- console.log(' ' + trans.about.feature1);
161
- console.log(' ' + trans.about.feature2);
162
- console.log(' ' + trans.about.feature3);
163
- console.log(' ' + trans.about.feature4);
164
- console.log();
165
- console.log(chalk.dim(trans.about.license.padEnd(12)) + 'MIT License');
166
- console.log(chalk.dim(trans.about.author.padEnd(12)) + 'm1ngsama');
167
- console.log();
86
+ const content = [
87
+ `${chalk.dim(trans.about.project.padEnd(12))}${APP_INFO.name}`,
88
+ `${chalk.dim(trans.about.version.padEnd(12))}v${APP_INFO.version}`,
89
+ `${chalk.dim(trans.about.description.padEnd(12))}${APP_INFO.fullDescription}`,
90
+ '',
91
+ `${chalk.dim(trans.about.github.padEnd(12))}${chalk.cyan(APP_INFO.repository)}`,
92
+ `${chalk.dim(trans.about.website.padEnd(12))}${chalk.cyan(URLS.homepage)}`,
93
+ `${chalk.dim(trans.about.email.padEnd(12))}${chalk.cyan(URLS.email)}`,
94
+ '',
95
+ chalk.dim(trans.about.features),
96
+ ' ' + trans.about.feature1,
97
+ ' ' + trans.about.feature2,
98
+ ' ' + trans.about.feature3,
99
+ ' ' + trans.about.feature4,
100
+ '',
101
+ `${chalk.dim(trans.about.license.padEnd(12))}MIT License`,
102
+ `${chalk.dim(trans.about.author.padEnd(12))}m1ngsama`,
103
+ ].join('\n');
104
+ note(content, trans.about.title);
168
105
  }
169
106
  /**
170
107
  * Display language selection menu
@@ -172,29 +109,20 @@ function showAbout() {
172
109
  async function showLanguageMenu() {
173
110
  const trans = t();
174
111
  const currentLang = getCurrentLanguage();
175
- console.log();
176
- console.log(chalk.bold('>> ' + trans.language.title));
177
- console.log();
178
- console.log(chalk.dim(trans.language.currentLanguage + ': ') + chalk.cyan(trans.language[currentLang]));
179
- console.log();
180
- const { language } = await inquirer.prompt([
181
- {
182
- type: 'list',
183
- name: 'language',
184
- message: trans.language.selectLanguage,
185
- choices: [
186
- { name: trans.language.zh, value: 'zh' },
187
- { name: trans.language.en, value: 'en' }
188
- ],
189
- default: currentLang
190
- }
191
- ]);
112
+ const language = await select({
113
+ message: trans.language.selectLanguage,
114
+ options: [
115
+ { value: 'zh', label: trans.language.zh, hint: currentLang === 'zh' ? ' 当前' : undefined },
116
+ { value: 'en', label: trans.language.en, hint: currentLang === 'en' ? '✓ current' : undefined },
117
+ ],
118
+ initialValue: currentLang,
119
+ });
120
+ if (isCancel(language))
121
+ return;
192
122
  if (language !== currentLang) {
193
123
  setLanguage(language);
194
124
  clearTranslationCache();
195
- console.log();
196
- console.log(chalk.green('✓ ' + t().language.changed));
197
- console.log();
125
+ success(t().language.changed);
198
126
  }
199
127
  }
200
128
  //# sourceMappingURL=menu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/core/menu.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"menu.js","sourceRoot":"","sources":["../../src/core/menu.ts"],"names":[],"mappings":"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"}
package/dist/core/ui.d.ts CHANGED
@@ -1,19 +1,7 @@
1
1
  /**
2
2
  * Minimalist UI component library
3
- * Provides basic terminal UI components
3
+ * Delegates to @clack/prompts for modern terminal output
4
4
  */
5
- /**
6
- * Display header title
7
- */
8
- export declare function printHeader(title: string): void;
9
- /**
10
- * Display divider line
11
- */
12
- export declare function printDivider(): void;
13
- /**
14
- * Display loading spinner
15
- */
16
- export declare function showSpinner(text: string, duration: number): Promise<void>;
17
5
  /**
18
6
  * Display success message
19
7
  */
@@ -30,6 +18,14 @@ export declare function info(msg: string): void;
30
18
  * Display warning message
31
19
  */
32
20
  export declare function warning(msg: string): void;
21
+ /**
22
+ * No-op: session framing moved to main.ts intro()
23
+ */
24
+ export declare function printHeader(_title: string): void;
25
+ /**
26
+ * Display divider line
27
+ */
28
+ export declare function printDivider(): void;
33
29
  /**
34
30
  * Clear screen
35
31
  */
@@ -38,4 +34,9 @@ export declare function clearScreen(): void;
38
34
  * Print empty lines
39
35
  */
40
36
  export declare function printNewLine(count?: number): void;
37
+ /**
38
+ * Create and start a real async spinner.
39
+ * Caller is responsible for calling .stop(msg) or .stop(msg, 1) on error.
40
+ */
41
+ export declare function createSpinner(msg: string): import("@clack/prompts").SpinnerResult;
41
42
  //# sourceMappingURL=ui.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/core/ui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAG/C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAGnC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB/E;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAIlC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,GAAE,MAAU,GAAG,IAAI,CAIpD"}
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/core/ui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEtC;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAGnC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAIlC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,GAAE,MAAU,GAAG,IAAI,CAIpD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,0CAIxC"}
package/dist/core/ui.js CHANGED
@@ -1,64 +1,45 @@
1
1
  /**
2
2
  * Minimalist UI component library
3
- * Provides basic terminal UI components
3
+ * Delegates to @clack/prompts for modern terminal output
4
4
  */
5
+ import { log, spinner as clackSpinner } from '@clack/prompts';
5
6
  import chalk from 'chalk';
6
- /**
7
- * Display header title
8
- */
9
- export function printHeader(title) {
10
- console.log(chalk.dim(title));
11
- console.log();
12
- }
13
- /**
14
- * Display divider line
15
- */
16
- export function printDivider() {
17
- const terminalWidth = process.stdout.columns || 80;
18
- console.log(chalk.dim('─'.repeat(Math.min(terminalWidth, 80))));
19
- }
20
- /**
21
- * Display loading spinner
22
- */
23
- export async function showSpinner(text, duration) {
24
- const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
25
- let i = 0;
26
- const startTime = Date.now();
27
- return new Promise((resolve) => {
28
- const interval = setInterval(() => {
29
- process.stdout.write(`\r${chalk.cyan(frames[i])} ${text}`);
30
- i = (i + 1) % frames.length;
31
- if (Date.now() - startTime >= duration) {
32
- clearInterval(interval);
33
- process.stdout.write('\r' + ' '.repeat(text.length + 5) + '\r');
34
- resolve();
35
- }
36
- }, 80);
37
- });
38
- }
39
7
  /**
40
8
  * Display success message
41
9
  */
42
10
  export function success(msg) {
43
- console.log(chalk.green('[✓]') + ' ' + msg);
11
+ log.success(msg);
44
12
  }
45
13
  /**
46
14
  * Display error message
47
15
  */
48
16
  export function error(msg) {
49
- console.error(chalk.red('[✗]') + ' ' + msg);
17
+ log.error(msg);
50
18
  }
51
19
  /**
52
20
  * Display info message
53
21
  */
54
22
  export function info(msg) {
55
- console.log(chalk.blue('[ℹ]') + ' ' + msg);
23
+ log.info(msg);
56
24
  }
57
25
  /**
58
26
  * Display warning message
59
27
  */
60
28
  export function warning(msg) {
61
- console.error(chalk.yellow('[⚠]') + ' ' + msg);
29
+ log.warn(msg);
30
+ }
31
+ /**
32
+ * No-op: session framing moved to main.ts intro()
33
+ */
34
+ export function printHeader(_title) {
35
+ // intentional noop — intro() in main.ts owns the header
36
+ }
37
+ /**
38
+ * Display divider line
39
+ */
40
+ export function printDivider() {
41
+ const terminalWidth = process.stdout.columns || 80;
42
+ console.log(chalk.dim('─'.repeat(Math.min(terminalWidth, 80))));
62
43
  }
63
44
  /**
64
45
  * Clear screen
@@ -76,4 +57,13 @@ export function printNewLine(count = 1) {
76
57
  console.log();
77
58
  }
78
59
  }
60
+ /**
61
+ * Create and start a real async spinner.
62
+ * Caller is responsible for calling .stop(msg) or .stop(msg, 1) on error.
63
+ */
64
+ export function createSpinner(msg) {
65
+ const s = clackSpinner();
66
+ s.start(msg);
67
+ return s;
68
+ }
79
69
  //# sourceMappingURL=ui.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/core/ui.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/core/ui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,GAAW;IAC/B,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAAC,GAAW;IAC9B,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,wDAAwD;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC;IACzB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACb,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * ICS calendar module
3
- * Fetches and renders upcoming events.
3
+ * Fetches and renders upcoming events with Unicode box table.
4
4
  */
5
5
  export interface Event {
6
6
  date: string;
@@ -18,6 +18,9 @@ export interface EventOutputItem {
18
18
  }
19
19
  export declare function fetchEvents(): Promise<Event[]>;
20
20
  export declare function serializeEvents(events: Event[]): EventOutputItem[];
21
+ /**
22
+ * Render events as a Unicode box-drawing table
23
+ */
21
24
  export declare function renderEventsTable(events: Event[], options?: {
22
25
  color?: boolean;
23
26
  }): string;
@@ -1 +1 @@
1
- {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../src/features/calendar.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAyCpD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAQlE;AAmBD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAqCxF;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAUnD;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAYlD"}
1
+ {"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../src/features/calendar.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAyCpD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAQlE;AAuDD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAoDxF;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAUnD;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAYlD"}
@@ -1,11 +1,11 @@
1
1
  /**
2
2
  * ICS calendar module
3
- * Fetches and renders upcoming events.
3
+ * Fetches and renders upcoming events with Unicode box table.
4
4
  */
5
5
  import axios from 'axios';
6
6
  import ICAL from 'ical.js';
7
7
  import chalk from 'chalk';
8
- import { error, info, printDivider } from '../core/ui.js';
8
+ import { info, printDivider, createSpinner } from '../core/ui.js';
9
9
  import { t } from '../i18n/index.js';
10
10
  export async function fetchEvents() {
11
11
  try {
@@ -53,10 +53,44 @@ export function serializeEvents(events) {
53
53
  startDateISO: event.startDate.toISOString()
54
54
  }));
55
55
  }
56
- function truncate(str, maxLength) {
57
- if (str.length <= maxLength)
56
+ /** Visual column width: CJK characters count as 2, everything else as 1. */
57
+ function visualWidth(str) {
58
+ let w = 0;
59
+ for (const ch of str) {
60
+ const cp = ch.codePointAt(0) ?? 0;
61
+ w += ((cp >= 0x1100 && cp <= 0x115F) || // Hangul Jamo
62
+ (cp >= 0x2E80 && cp <= 0x303F) || // CJK Radicals / Kangxi
63
+ (cp >= 0x3040 && cp <= 0x33FF) || // Japanese kana + CJK symbols
64
+ (cp >= 0x3400 && cp <= 0x4DBF) || // CJK Extension A
65
+ (cp >= 0x4E00 && cp <= 0x9FFF) || // CJK Unified Ideographs
66
+ (cp >= 0xAC00 && cp <= 0xD7AF) || // Hangul Syllables
67
+ (cp >= 0xF900 && cp <= 0xFAFF) || // CJK Compatibility Ideographs
68
+ (cp >= 0xFE30 && cp <= 0xFE4F) || // CJK Compatibility Forms
69
+ (cp >= 0xFF00 && cp <= 0xFF60) || // Fullwidth Forms
70
+ (cp >= 0xFFE0 && cp <= 0xFFE6) // Fullwidth Signs
71
+ ) ? 2 : 1;
72
+ }
73
+ return w;
74
+ }
75
+ /** Pad string to visual width (CJK-aware). */
76
+ function padEndV(str, width) {
77
+ const pad = width - visualWidth(str);
78
+ return pad > 0 ? str + ' '.repeat(pad) : str;
79
+ }
80
+ /** Truncate string to visual width limit (CJK-aware). */
81
+ function truncate(str, maxWidth) {
82
+ if (visualWidth(str) <= maxWidth)
58
83
  return str;
59
- return str.substring(0, maxLength - 3) + '...';
84
+ let w = 0;
85
+ let i = 0;
86
+ for (const ch of str) {
87
+ const cw = (visualWidth(ch) === 2) ? 2 : 1;
88
+ if (w + cw > maxWidth - 3)
89
+ break;
90
+ w += cw;
91
+ i += ch.length;
92
+ }
93
+ return str.slice(0, i) + '...';
60
94
  }
61
95
  function formatDate(date) {
62
96
  const month = String(date.getMonth() + 1).padStart(2, '0');
@@ -68,33 +102,44 @@ function formatTime(date) {
68
102
  const minutes = String(date.getMinutes()).padStart(2, '0');
69
103
  return `${hours}:${minutes}`;
70
104
  }
105
+ /**
106
+ * Render events as a Unicode box-drawing table
107
+ */
71
108
  export function renderEventsTable(events, options) {
72
109
  const trans = t();
73
110
  const color = options?.color !== false;
74
111
  if (events.length === 0) {
75
112
  return trans.calendar.noEvents;
76
113
  }
77
- const dateWidth = 14;
78
- const titleWidth = 32;
79
- const locationWidth = 20;
114
+ const dateWidth = 13;
115
+ const titleWidth = 30;
116
+ const locationWidth = 16;
117
+ const top = `┌${'─'.repeat(dateWidth + 2)}┬${'─'.repeat(titleWidth + 2)}┬${'─'.repeat(locationWidth + 2)}┐`;
118
+ const divider = `├${'─'.repeat(dateWidth + 2)}┼${'─'.repeat(titleWidth + 2)}┼${'─'.repeat(locationWidth + 2)}┤`;
119
+ const bottom = `└${'─'.repeat(dateWidth + 2)}┴${'─'.repeat(titleWidth + 2)}┴${'─'.repeat(locationWidth + 2)}┘`;
120
+ const headerRow = `│ ${padEndV(trans.calendar.dateTime, dateWidth)} │ ${padEndV(trans.calendar.eventName, titleWidth)} │ ${padEndV(trans.calendar.location, locationWidth)} │`;
80
121
  const lines = [];
81
- lines.push(`${trans.calendar.title} ${trans.calendar.subtitle}`);
82
- lines.push(`${trans.calendar.dateTime.padEnd(dateWidth)}${trans.calendar.eventName.padEnd(titleWidth)}${trans.calendar.location}`);
83
- lines.push('-'.repeat(Math.min((process.stdout.columns || 80), 80)));
84
- for (const event of events) {
85
- const dateTime = `${event.date} ${event.time}`.padEnd(dateWidth);
86
- const title = truncate(event.title, titleWidth - 1).padEnd(titleWidth);
87
- const location = truncate(event.location, locationWidth);
88
- if (color) {
89
- lines.push(chalk.cyan(dateTime) + chalk.white(title) + chalk.gray(location));
90
- }
91
- else {
92
- lines.push(dateTime + title + location);
122
+ if (color) {
123
+ lines.push(chalk.dim(top));
124
+ lines.push(chalk.bold(headerRow));
125
+ lines.push(chalk.dim(divider));
126
+ for (const event of events) {
127
+ const dateTime = `${event.date} ${event.time}`;
128
+ const title = truncate(event.title, titleWidth);
129
+ const location = truncate(event.location, locationWidth);
130
+ lines.push(`│ ${chalk.cyan(padEndV(dateTime, dateWidth))} ${chalk.white(padEndV(title, titleWidth))} ${chalk.gray(padEndV(location, locationWidth))} │`);
93
131
  }
132
+ lines.push(chalk.dim(bottom));
94
133
  }
95
- if (color) {
96
- lines[0] = chalk.cyan.bold(lines[0]);
97
- lines[1] = chalk.bold(lines[1]);
134
+ else {
135
+ lines.push(top);
136
+ lines.push(headerRow);
137
+ lines.push(divider);
138
+ for (const event of events) {
139
+ const dateTime = `${event.date} ${event.time}`;
140
+ lines.push(`│ ${padEndV(dateTime, dateWidth)} │ ${padEndV(truncate(event.title, titleWidth), titleWidth)} │ ${padEndV(truncate(event.location, locationWidth), locationWidth)} │`);
141
+ }
142
+ lines.push(bottom);
98
143
  }
99
144
  return lines.join('\n');
100
145
  }
@@ -110,14 +155,14 @@ export function displayEvents(events) {
110
155
  }
111
156
  export async function showCalendar() {
112
157
  const trans = t();
158
+ const s = createSpinner(trans.calendar.loading);
113
159
  try {
114
- info(trans.calendar.loading);
115
160
  const events = await fetchEvents();
116
- console.log('\r' + ' '.repeat(60) + '\r');
161
+ s.stop(`${events.length} ${trans.calendar.eventsFound}`);
117
162
  displayEvents(events);
118
163
  }
119
164
  catch {
120
- error(trans.calendar.error);
165
+ s.error(trans.calendar.error);
121
166
  console.log(chalk.gray(' ' + trans.calendar.errorHint));
122
167
  console.log();
123
168
  }