@nbtca/prompt 1.0.5 → 1.0.6
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.
- package/dist/config/data.d.ts +1 -1
- package/dist/config/data.js +1 -1
- package/dist/core/logo.d.ts +3 -3
- package/dist/core/logo.js +40 -40
- package/dist/core/logo.js.map +1 -1
- package/dist/core/menu.d.ts +3 -3
- package/dist/core/menu.d.ts.map +1 -1
- package/dist/core/menu.js +112 -67
- package/dist/core/menu.js.map +1 -1
- package/dist/core/ui.d.ts +11 -11
- package/dist/core/ui.js +15 -15
- package/dist/core/ui.js.map +1 -1
- package/dist/features/calendar.d.ts.map +1 -1
- package/dist/features/calendar.js +21 -15
- package/dist/features/calendar.js.map +1 -1
- package/dist/features/docs.d.ts.map +1 -1
- package/dist/features/docs.js +35 -29
- package/dist/features/docs.js.map +1 -1
- package/dist/features/repair.d.ts.map +1 -1
- package/dist/features/repair.js +6 -10
- package/dist/features/repair.js.map +1 -1
- package/dist/features/website.d.ts +3 -3
- package/dist/features/website.d.ts.map +1 -1
- package/dist/features/website.js +11 -9
- package/dist/features/website.js.map +1 -1
- package/dist/i18n/index.d.ts +140 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +113 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/main.d.ts +2 -2
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +11 -10
- package/dist/main.js.map +1 -1
- package/package.json +1 -1
- package/src/config/data.ts +1 -1
- package/src/core/logo.ts +40 -40
- package/src/core/menu.ts +119 -67
- package/src/core/ui.ts +15 -15
- package/src/features/calendar.ts +23 -15
- package/src/features/docs.ts +35 -29
- package/src/features/repair.ts +6 -10
- package/src/features/website.ts +11 -9
- package/src/i18n/index.ts +236 -0
- package/src/i18n/locales/en.json +107 -0
- package/src/i18n/locales/zh.json +107 -0
- package/src/main.ts +11 -10
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internationalization (i18n) System
|
|
3
|
+
* Multi-language support for the application
|
|
4
|
+
*/
|
|
5
|
+
export type Language = 'zh' | 'en';
|
|
6
|
+
/**
|
|
7
|
+
* Translation structure
|
|
8
|
+
*/
|
|
9
|
+
export interface Translations {
|
|
10
|
+
common: {
|
|
11
|
+
back: string;
|
|
12
|
+
exit: string;
|
|
13
|
+
cancel: string;
|
|
14
|
+
confirm: string;
|
|
15
|
+
loading: string;
|
|
16
|
+
error: string;
|
|
17
|
+
success: string;
|
|
18
|
+
goodbye: string;
|
|
19
|
+
};
|
|
20
|
+
menu: {
|
|
21
|
+
title: string;
|
|
22
|
+
events: string;
|
|
23
|
+
eventsDesc: string;
|
|
24
|
+
repair: string;
|
|
25
|
+
repairDesc: string;
|
|
26
|
+
docs: string;
|
|
27
|
+
docsDesc: string;
|
|
28
|
+
website: string;
|
|
29
|
+
websiteDesc: string;
|
|
30
|
+
github: string;
|
|
31
|
+
githubDesc: string;
|
|
32
|
+
about: string;
|
|
33
|
+
aboutDesc: string;
|
|
34
|
+
language: string;
|
|
35
|
+
languageDesc: string;
|
|
36
|
+
navigationHint: string;
|
|
37
|
+
chooseAction: string;
|
|
38
|
+
};
|
|
39
|
+
about: {
|
|
40
|
+
title: string;
|
|
41
|
+
project: string;
|
|
42
|
+
version: string;
|
|
43
|
+
description: string;
|
|
44
|
+
github: string;
|
|
45
|
+
website: string;
|
|
46
|
+
email: string;
|
|
47
|
+
features: string;
|
|
48
|
+
feature1: string;
|
|
49
|
+
feature2: string;
|
|
50
|
+
feature3: string;
|
|
51
|
+
feature4: string;
|
|
52
|
+
license: string;
|
|
53
|
+
author: string;
|
|
54
|
+
};
|
|
55
|
+
calendar: {
|
|
56
|
+
title: string;
|
|
57
|
+
subtitle: string;
|
|
58
|
+
loading: string;
|
|
59
|
+
noEvents: string;
|
|
60
|
+
error: string;
|
|
61
|
+
errorHint: string;
|
|
62
|
+
dateTime: string;
|
|
63
|
+
eventName: string;
|
|
64
|
+
location: string;
|
|
65
|
+
};
|
|
66
|
+
docs: {
|
|
67
|
+
title: string;
|
|
68
|
+
subtitle: string;
|
|
69
|
+
loading: string;
|
|
70
|
+
loadingDir: string;
|
|
71
|
+
chooseCategory: string;
|
|
72
|
+
currentDir: string;
|
|
73
|
+
chooseDoc: string;
|
|
74
|
+
emptyDir: string;
|
|
75
|
+
upToParent: string;
|
|
76
|
+
returnToMenu: string;
|
|
77
|
+
backToList: string;
|
|
78
|
+
reread: string;
|
|
79
|
+
openBrowser: string;
|
|
80
|
+
loadError: string;
|
|
81
|
+
errorHint: string;
|
|
82
|
+
openBrowserPrompt: string;
|
|
83
|
+
docCompleted: string;
|
|
84
|
+
chooseAction: string;
|
|
85
|
+
opening: string;
|
|
86
|
+
browserOpened: string;
|
|
87
|
+
browserError: string;
|
|
88
|
+
browserErrorHint: string;
|
|
89
|
+
retry: string;
|
|
90
|
+
pagerNotAvailable: string;
|
|
91
|
+
endOfDocument: string;
|
|
92
|
+
};
|
|
93
|
+
repair: {
|
|
94
|
+
title: string;
|
|
95
|
+
subtitle: string;
|
|
96
|
+
opening: string;
|
|
97
|
+
opened: string;
|
|
98
|
+
error: string;
|
|
99
|
+
errorHint: string;
|
|
100
|
+
};
|
|
101
|
+
website: {
|
|
102
|
+
opening: string;
|
|
103
|
+
opened: string;
|
|
104
|
+
error: string;
|
|
105
|
+
errorHint: string;
|
|
106
|
+
};
|
|
107
|
+
language: {
|
|
108
|
+
title: string;
|
|
109
|
+
currentLanguage: string;
|
|
110
|
+
selectLanguage: string;
|
|
111
|
+
zh: string;
|
|
112
|
+
en: string;
|
|
113
|
+
changed: string;
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Load language preference from config file
|
|
118
|
+
*/
|
|
119
|
+
export declare function loadLanguagePreference(): Language;
|
|
120
|
+
/**
|
|
121
|
+
* Save language preference to config file
|
|
122
|
+
*/
|
|
123
|
+
export declare function saveLanguagePreference(language: Language): void;
|
|
124
|
+
/**
|
|
125
|
+
* Get current language
|
|
126
|
+
*/
|
|
127
|
+
export declare function getCurrentLanguage(): Language;
|
|
128
|
+
/**
|
|
129
|
+
* Set current language
|
|
130
|
+
*/
|
|
131
|
+
export declare function setLanguage(language: Language): void;
|
|
132
|
+
/**
|
|
133
|
+
* Get translations for current language
|
|
134
|
+
*/
|
|
135
|
+
export declare function t(): Translations;
|
|
136
|
+
/**
|
|
137
|
+
* Clear translation cache (useful when switching languages)
|
|
138
|
+
*/
|
|
139
|
+
export declare function clearTranslationCache(): void;
|
|
140
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internationalization (i18n) System
|
|
3
|
+
* Multi-language support for the application
|
|
4
|
+
*/
|
|
5
|
+
import fs from 'fs';
|
|
6
|
+
import path from 'path';
|
|
7
|
+
import { fileURLToPath } from 'url';
|
|
8
|
+
import { dirname } from 'path';
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = dirname(__filename);
|
|
11
|
+
/**
|
|
12
|
+
* Language configuration
|
|
13
|
+
*/
|
|
14
|
+
let currentLanguage = 'zh'; // Default to Chinese
|
|
15
|
+
/**
|
|
16
|
+
* Get configuration directory path
|
|
17
|
+
*/
|
|
18
|
+
function getConfigDir() {
|
|
19
|
+
const homeDir = process.env['HOME'] || process.env['USERPROFILE'] || '';
|
|
20
|
+
return path.join(homeDir, '.nbtca');
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get language configuration file path
|
|
24
|
+
*/
|
|
25
|
+
function getLanguageConfigPath() {
|
|
26
|
+
return path.join(getConfigDir(), 'language.json');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Load language preference from config file
|
|
30
|
+
*/
|
|
31
|
+
export function loadLanguagePreference() {
|
|
32
|
+
try {
|
|
33
|
+
const configPath = getLanguageConfigPath();
|
|
34
|
+
if (fs.existsSync(configPath)) {
|
|
35
|
+
const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
36
|
+
if (config.language === 'zh' || config.language === 'en') {
|
|
37
|
+
currentLanguage = config.language;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
// If loading fails, use default (Chinese)
|
|
43
|
+
}
|
|
44
|
+
return currentLanguage;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Save language preference to config file
|
|
48
|
+
*/
|
|
49
|
+
export function saveLanguagePreference(language) {
|
|
50
|
+
try {
|
|
51
|
+
const configDir = getConfigDir();
|
|
52
|
+
if (!fs.existsSync(configDir)) {
|
|
53
|
+
fs.mkdirSync(configDir, { recursive: true });
|
|
54
|
+
}
|
|
55
|
+
const configPath = getLanguageConfigPath();
|
|
56
|
+
fs.writeFileSync(configPath, JSON.stringify({ language }, null, 2));
|
|
57
|
+
currentLanguage = language;
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
// Silently fail if we can't save preference
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get current language
|
|
65
|
+
*/
|
|
66
|
+
export function getCurrentLanguage() {
|
|
67
|
+
return currentLanguage;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Set current language
|
|
71
|
+
*/
|
|
72
|
+
export function setLanguage(language) {
|
|
73
|
+
currentLanguage = language;
|
|
74
|
+
saveLanguagePreference(language);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Load translation file
|
|
78
|
+
*/
|
|
79
|
+
function loadTranslations(language) {
|
|
80
|
+
try {
|
|
81
|
+
const translationPath = path.join(__dirname, 'locales', `${language}.json`);
|
|
82
|
+
const content = fs.readFileSync(translationPath, 'utf-8');
|
|
83
|
+
return JSON.parse(content);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
// Fallback to Chinese if loading fails
|
|
87
|
+
const fallbackPath = path.join(__dirname, 'locales', 'zh.json');
|
|
88
|
+
const content = fs.readFileSync(fallbackPath, 'utf-8');
|
|
89
|
+
return JSON.parse(content);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Translation cache
|
|
94
|
+
*/
|
|
95
|
+
let translationsCache = new Map();
|
|
96
|
+
/**
|
|
97
|
+
* Get translations for current language
|
|
98
|
+
*/
|
|
99
|
+
export function t() {
|
|
100
|
+
if (!translationsCache.has(currentLanguage)) {
|
|
101
|
+
translationsCache.set(currentLanguage, loadTranslations(currentLanguage));
|
|
102
|
+
}
|
|
103
|
+
return translationsCache.get(currentLanguage);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Clear translation cache (useful when switching languages)
|
|
107
|
+
*/
|
|
108
|
+
export function clearTranslationCache() {
|
|
109
|
+
translationsCache.clear();
|
|
110
|
+
}
|
|
111
|
+
// Initialize language preference on module load
|
|
112
|
+
loadLanguagePreference();
|
|
113
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"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"}
|
package/dist/main.d.ts
CHANGED
package/dist/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA4B1C"}
|
package/dist/main.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* NBTCA Welcome Tool
|
|
3
|
-
*
|
|
3
|
+
* Minimalist startup flow
|
|
4
4
|
*/
|
|
5
5
|
import chalk from 'chalk';
|
|
6
6
|
import { printLogo } from './core/logo.js';
|
|
@@ -8,31 +8,32 @@ import { printHeader, clearScreen } from './core/ui.js';
|
|
|
8
8
|
import { showMainMenu } from './core/menu.js';
|
|
9
9
|
import { APP_INFO } from './config/data.js';
|
|
10
10
|
import { enableVimKeys } from './core/vim-keys.js';
|
|
11
|
+
import { t } from './i18n/index.js';
|
|
11
12
|
/**
|
|
12
|
-
*
|
|
13
|
+
* Main program entry point
|
|
13
14
|
*/
|
|
14
15
|
export async function main() {
|
|
15
16
|
try {
|
|
16
|
-
//
|
|
17
|
+
// Enable Vim key bindings
|
|
17
18
|
enableVimKeys();
|
|
18
|
-
//
|
|
19
|
+
// Clear screen
|
|
19
20
|
clearScreen();
|
|
20
|
-
//
|
|
21
|
+
// Display logo (smart fallback)
|
|
21
22
|
await printLogo();
|
|
22
|
-
//
|
|
23
|
+
// Display version info
|
|
23
24
|
printHeader(`v${APP_INFO.version}`);
|
|
24
|
-
//
|
|
25
|
+
// Show main menu (loop)
|
|
25
26
|
await showMainMenu();
|
|
26
27
|
}
|
|
27
28
|
catch (err) {
|
|
28
|
-
//
|
|
29
|
+
// Handle Ctrl+C exit
|
|
29
30
|
if (err.message?.includes('SIGINT') || err.message?.includes('User force closed')) {
|
|
30
31
|
console.log();
|
|
31
|
-
console.log(chalk.dim(
|
|
32
|
+
console.log(chalk.dim(t().common.goodbye));
|
|
32
33
|
process.exit(0);
|
|
33
34
|
}
|
|
34
35
|
else {
|
|
35
|
-
console.error('
|
|
36
|
+
console.error('Error occurred:', err);
|
|
36
37
|
process.exit(1);
|
|
37
38
|
}
|
|
38
39
|
}
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,IAAI,CAAC;QACH,0BAA0B;QAC1B,aAAa,EAAE,CAAC;QAEhB,eAAe;QACf,WAAW,EAAE,CAAC;QAEd,gCAAgC;QAChC,MAAM,SAAS,EAAE,CAAC;QAElB,uBAAuB;QACvB,WAAW,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAEpC,wBAAwB;QACxB,MAAM,YAAY,EAAE,CAAC;IAEvB,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,qBAAqB;QACrB,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAClF,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
package/src/config/data.ts
CHANGED
package/src/core/logo.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* Smart logo display module
|
|
3
|
+
* Attempts to display iTerm2 image format logo, falls back to ASCII art
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { readFileSync } from 'fs';
|
|
@@ -12,20 +12,20 @@ const __filename = fileURLToPath(import.meta.url);
|
|
|
12
12
|
const __dirname = dirname(__filename);
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* Create blue-toned gradient effect
|
|
16
16
|
*/
|
|
17
17
|
function createBlueGradient(text: string): string {
|
|
18
|
-
//
|
|
18
|
+
// Blue gradient: deep blue -> sky blue -> cyan
|
|
19
19
|
const blueGradient = gradient([
|
|
20
|
-
{ color: '#1e3a8a', pos: 0 }, //
|
|
21
|
-
{ color: '#0ea5e9', pos: 0.5 }, //
|
|
22
|
-
{ color: '#06b6d4', pos: 1 } //
|
|
20
|
+
{ color: '#1e3a8a', pos: 0 }, // Deep blue
|
|
21
|
+
{ color: '#0ea5e9', pos: 0.5 }, // Sky blue
|
|
22
|
+
{ color: '#06b6d4', pos: 1 } // Cyan
|
|
23
23
|
]);
|
|
24
24
|
return blueGradient(text);
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
|
-
*
|
|
28
|
+
* Convert hex color to RGB
|
|
29
29
|
*/
|
|
30
30
|
function hexToRgb(hex: string): [number, number, number] {
|
|
31
31
|
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
@@ -35,7 +35,7 @@ function hexToRgb(hex: string): [number, number, number] {
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
/**
|
|
38
|
-
*
|
|
38
|
+
* Convert RGB to hex color
|
|
39
39
|
*/
|
|
40
40
|
function rgbToHex(r: number, g: number, b: number): string {
|
|
41
41
|
return '#' + [r, g, b].map(x => {
|
|
@@ -45,7 +45,7 @@ function rgbToHex(r: number, g: number, b: number): string {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
|
-
*
|
|
48
|
+
* Linear interpolation between two colors
|
|
49
49
|
*/
|
|
50
50
|
function interpolateColor(color1: string, color2: string, factor: number): string {
|
|
51
51
|
const [r1, g1, b1] = hexToRgb(color1);
|
|
@@ -59,45 +59,45 @@ function interpolateColor(color1: string, color2: string, factor: number): strin
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
/**
|
|
62
|
-
*
|
|
62
|
+
* Easing function - smooth in-out effect
|
|
63
63
|
*/
|
|
64
64
|
function easeInOutSine(t: number): number {
|
|
65
65
|
return -(Math.cos(Math.PI * t) - 1) / 2;
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
/**
|
|
69
|
-
*
|
|
69
|
+
* Display gradient animation effect (optimized - truly smooth animation)
|
|
70
70
|
*/
|
|
71
71
|
async function animateGradient(text: string, duration: number = 1200): Promise<void> {
|
|
72
|
-
const frames = 60; // 60
|
|
72
|
+
const frames = 60; // 60 frames for truly smooth animation
|
|
73
73
|
const frameDelay = duration / frames;
|
|
74
74
|
|
|
75
|
-
//
|
|
75
|
+
// Define color sequence - forms complete blue spectrum cycle
|
|
76
76
|
const colorSequence = [
|
|
77
|
-
'#1e3a8a', //
|
|
78
|
-
'#2563eb', //
|
|
79
|
-
'#3b82f6', //
|
|
80
|
-
'#0ea5e9', //
|
|
81
|
-
'#06b6d4', //
|
|
82
|
-
'#14b8a6', //
|
|
83
|
-
'#06b6d4', //
|
|
84
|
-
'#0ea5e9', //
|
|
85
|
-
'#3b82f6', //
|
|
86
|
-
'#2563eb', //
|
|
87
|
-
'#1e3a8a', //
|
|
77
|
+
'#1e3a8a', // Deep blue
|
|
78
|
+
'#2563eb', // Blue
|
|
79
|
+
'#3b82f6', // Bright blue
|
|
80
|
+
'#0ea5e9', // Sky blue
|
|
81
|
+
'#06b6d4', // Cyan
|
|
82
|
+
'#14b8a6', // Teal
|
|
83
|
+
'#06b6d4', // Cyan
|
|
84
|
+
'#0ea5e9', // Sky blue
|
|
85
|
+
'#3b82f6', // Bright blue
|
|
86
|
+
'#2563eb', // Blue
|
|
87
|
+
'#1e3a8a', // Deep blue
|
|
88
88
|
];
|
|
89
89
|
|
|
90
90
|
for (let i = 0; i < frames; i++) {
|
|
91
|
-
//
|
|
91
|
+
// Use smooth sine easing
|
|
92
92
|
const progress = easeInOutSine(i / frames);
|
|
93
93
|
|
|
94
|
-
//
|
|
94
|
+
// Calculate position in color sequence
|
|
95
95
|
const position = progress * (colorSequence.length - 1);
|
|
96
96
|
const index1 = Math.floor(position);
|
|
97
97
|
const index2 = Math.min(index1 + 1, colorSequence.length - 1);
|
|
98
98
|
const localProgress = position - index1;
|
|
99
99
|
|
|
100
|
-
//
|
|
100
|
+
// Interpolate between adjacent colors, generating three smoothly transitioning colors
|
|
101
101
|
const color1 = interpolateColor(
|
|
102
102
|
colorSequence[index1]!,
|
|
103
103
|
colorSequence[index2]!,
|
|
@@ -120,44 +120,44 @@ async function animateGradient(text: string, duration: number = 1200): Promise<v
|
|
|
120
120
|
localProgress
|
|
121
121
|
);
|
|
122
122
|
|
|
123
|
-
//
|
|
123
|
+
// Create gradient for current frame
|
|
124
124
|
const frameGradient = gradient(color1, color2, color3);
|
|
125
125
|
|
|
126
|
-
//
|
|
126
|
+
// Clear current line and display new frame
|
|
127
127
|
process.stdout.write('\r' + frameGradient(text));
|
|
128
128
|
|
|
129
129
|
await new Promise(resolve => setTimeout(resolve, frameDelay));
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
//
|
|
132
|
+
// Finally display static blue gradient
|
|
133
133
|
process.stdout.write('\r' + createBlueGradient(text) + '\n');
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
/**
|
|
137
|
-
*
|
|
137
|
+
* Attempt to read and display logo file
|
|
138
138
|
*/
|
|
139
139
|
export async function printLogo(): Promise<void> {
|
|
140
140
|
try {
|
|
141
|
-
//
|
|
141
|
+
// Try to read iTerm2 image format logo
|
|
142
142
|
const logoPath = join(__dirname, '../logo/logo.txt');
|
|
143
143
|
const logoContent = readFileSync(logoPath, 'utf-8');
|
|
144
144
|
|
|
145
|
-
//
|
|
145
|
+
// If successfully read and content is valid, display directly
|
|
146
146
|
if (logoContent && logoContent.length > 100) {
|
|
147
147
|
console.log(logoContent);
|
|
148
148
|
await printDescription();
|
|
149
149
|
return;
|
|
150
150
|
}
|
|
151
151
|
} catch (error) {
|
|
152
|
-
// iTerm2 logo
|
|
152
|
+
// iTerm2 logo read failed, continue trying ASCII logo
|
|
153
153
|
}
|
|
154
154
|
|
|
155
|
-
//
|
|
155
|
+
// Fallback: display ASCII art logo
|
|
156
156
|
try {
|
|
157
157
|
const asciiLogoPath = join(__dirname, '../logo/ascii-logo.txt');
|
|
158
158
|
const asciiContent = readFileSync(asciiLogoPath, 'utf-8');
|
|
159
159
|
|
|
160
|
-
//
|
|
160
|
+
// Display ASCII logo with gradient colors
|
|
161
161
|
console.log();
|
|
162
162
|
const lines = asciiContent.split('\n').filter(line => line.trim());
|
|
163
163
|
lines.forEach(line => {
|
|
@@ -166,7 +166,7 @@ export async function printLogo(): Promise<void> {
|
|
|
166
166
|
|
|
167
167
|
await printDescription();
|
|
168
168
|
} catch (error) {
|
|
169
|
-
//
|
|
169
|
+
// If ASCII logo also fails, display simple text logo
|
|
170
170
|
console.log();
|
|
171
171
|
console.log(createBlueGradient(' NBTCA'));
|
|
172
172
|
await printDescription();
|
|
@@ -174,14 +174,14 @@ export async function printLogo(): Promise<void> {
|
|
|
174
174
|
}
|
|
175
175
|
|
|
176
176
|
/**
|
|
177
|
-
*
|
|
177
|
+
* Display description text (with gradient animation)
|
|
178
178
|
*/
|
|
179
179
|
async function printDescription(): Promise<void> {
|
|
180
180
|
const tagline = 'To be at the intersection of technology and liberal arts.';
|
|
181
181
|
|
|
182
182
|
console.log();
|
|
183
183
|
|
|
184
|
-
//
|
|
184
|
+
// Display gradient animation
|
|
185
185
|
await animateGradient(tagline, 1500);
|
|
186
186
|
|
|
187
187
|
console.log();
|