gautham 1.0.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.
package/README.md ADDED
@@ -0,0 +1,22 @@
1
+ # gautham
2
+
3
+ > A fancy interactive terminal card for R Gautham.
4
+
5
+ ## Usage
6
+
7
+ ```bash
8
+ npx gautham
9
+ ```
10
+
11
+ No install needed. Just run and explore.
12
+
13
+ ## Features
14
+
15
+ - ASCII name art with gradient colors
16
+ - Scrolling marquee intro
17
+ - Interactive arrow-key menu
18
+ - Opens portfolio, resume, and email directly
19
+
20
+ ## Built with
21
+
22
+ chalk · figlet · gradient-string · inquirer · boxen · ora · open
package/bin/index.js ADDED
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env node
2
+
3
+ import chalk from 'chalk';
4
+ import ora from 'ora';
5
+ import { renderNameArt, renderTagline, runMarquee } from '../src/art.js';
6
+ import { renderCard } from '../src/card.js';
7
+ import { runMenu } from '../src/actions.js';
8
+
9
+ async function main() {
10
+ console.clear();
11
+ console.log();
12
+
13
+ // 1. Intro spinner
14
+ const spinner = ora({
15
+ text: chalk.magenta('Loading Gautham\'s card...'),
16
+ spinner: 'dots2',
17
+ color: 'magenta',
18
+ }).start();
19
+
20
+ await new Promise((r) => setTimeout(r, 900));
21
+ spinner.stop();
22
+ console.clear();
23
+ console.log();
24
+
25
+ // 2. ASCII name art
26
+ renderNameArt();
27
+ console.log();
28
+
29
+ // 3. Scrolling marquee
30
+ await runMarquee(2800);
31
+
32
+ // 4. Tagline
33
+ renderTagline();
34
+
35
+ // 5. Info card
36
+ renderCard();
37
+
38
+ // 6. Interactive menu
39
+ await runMenu();
40
+ }
41
+
42
+ main().catch((err) => {
43
+ console.error(chalk.red('\nSomething went wrong:'), err.message);
44
+ process.exit(1);
45
+ });
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "gautham",
3
+ "version": "1.0.0",
4
+ "description": "A fancy terminal card for R Gautham — developer, builder, human.",
5
+ "type": "module",
6
+ "bin": {
7
+ "gautham": "./bin/index.js"
8
+ },
9
+ "scripts": {
10
+ "start": "node bin/index.js"
11
+ },
12
+ "keywords": [
13
+ "card",
14
+ "cli",
15
+ "gautham",
16
+ "developer",
17
+ "portfolio"
18
+ ],
19
+ "author": "R Gautham",
20
+ "license": "MIT",
21
+ "engines": {
22
+ "node": ">=16.0.0"
23
+ },
24
+ "dependencies": {
25
+ "boxen": "^8.0.1",
26
+ "chalk": "^5.6.2",
27
+ "figlet": "^1.11.0",
28
+ "gradient-string": "^3.0.0",
29
+ "inquirer": "^13.4.1",
30
+ "open": "^11.0.0",
31
+ "ora": "^9.3.0"
32
+ }
33
+ }
package/src/actions.js ADDED
@@ -0,0 +1,110 @@
1
+ import inquirer from 'inquirer';
2
+ import chalk from 'chalk';
3
+ import open from 'open';
4
+ import ora from 'ora';
5
+
6
+ const RESUME_URL = 'https://drive.google.com/file/d/1aBl2IYIgt_bExuDYE9riS3UN0WEqegKS/view?usp=drive_link';
7
+ const PORTFOLIO_URL = 'https://personal-portfolio-two-sooty.vercel.app/ ';
8
+ const EMAIL = 'gauthamramesh93442@gmail.com';
9
+
10
+ const ACTIONS = [
11
+ {
12
+ name: `${chalk.greenBright('↵')} Download Resume ${chalk.dim('Opens in browser')}`,
13
+ value: 'resume',
14
+ },
15
+ {
16
+ name: `${chalk.cyanBright('↵')} Go to Portfolio ${chalk.dim('rgautham.dev')}`,
17
+ value: 'portfolio',
18
+ },
19
+ {
20
+ name: `${chalk.yellowBright('↵')} Send an Email ${chalk.dim('Open mail client')}`,
21
+ value: 'email',
22
+ },
23
+ {
24
+ name: `${chalk.dim('↵')} Exit`,
25
+ value: 'exit',
26
+ },
27
+ ];
28
+
29
+ async function handleAction(action) {
30
+ switch (action) {
31
+ case 'resume': {
32
+ const spinner = ora({
33
+ text: chalk.green('Opening resume...'),
34
+ color: 'green',
35
+ }).start();
36
+ await open(RESUME_URL);
37
+ spinner.succeed(chalk.greenBright('Resume opened in your browser!'));
38
+ break;
39
+ }
40
+
41
+ case 'portfolio': {
42
+ const spinner = ora({
43
+ text: chalk.cyan('Launching portfolio...'),
44
+ color: 'cyan',
45
+ }).start();
46
+ await open(PORTFOLIO_URL);
47
+ spinner.succeed(chalk.cyanBright('Portfolio opened → rgautham.dev'));
48
+ break;
49
+ }
50
+
51
+ case 'email': {
52
+ const spinner = ora({
53
+ text: chalk.yellow('Opening mail client...'),
54
+ color: 'yellow',
55
+ }).start();
56
+ await open(`mailto:${EMAIL}?subject=Hey Gautham!&body=Hi Gautham!, I came across your card and wanted to connect.`);
57
+ spinner.succeed(chalk.yellowBright(`Mail client opened → ${EMAIL}`));
58
+ break;
59
+ }
60
+
61
+ case 'exit': {
62
+ console.log();
63
+ console.log(chalk.magenta(' Thanks for stopping by. Let\'s build something great together! 🚀'));
64
+ console.log(chalk.dim(' — Gautham\n'));
65
+ process.exit(0);
66
+ }
67
+ }
68
+ }
69
+
70
+ export async function runMenu() {
71
+ console.log(chalk.dim(' Use arrow keys to navigate · Press Enter to select\n'));
72
+
73
+ let keepGoing = true;
74
+
75
+ while (keepGoing) {
76
+ const { action } = await inquirer.prompt([
77
+ {
78
+ type: 'list',
79
+ name: 'action',
80
+ message: chalk.white('What would you like to do? (Type resume/portfolio/email to navigate -)'),
81
+ choices: ACTIONS,
82
+ pageSize: 4,
83
+ },
84
+ ]);
85
+
86
+ console.log();
87
+ await handleAction(action);
88
+ console.log();
89
+
90
+ if (action === 'exit') {
91
+ keepGoing = false;
92
+ } else {
93
+ // After any action, let the menu loop back so user can do more
94
+ const { again } = await inquirer.prompt([
95
+ {
96
+ type: 'confirm',
97
+ name: 'again',
98
+ message: chalk.dim('Back to menu?'),
99
+ default: true,
100
+ },
101
+ ]);
102
+ keepGoing = again;
103
+ if (!keepGoing) {
104
+ console.log(chalk.magenta('\n Thanks for stopping by! 🚀\n'));
105
+ process.exit(0);
106
+ }
107
+ console.log();
108
+ }
109
+ }
110
+ }
package/src/art.js ADDED
@@ -0,0 +1,42 @@
1
+ import figlet from 'figlet';
2
+ import gradient from 'gradient-string';
3
+
4
+ export function renderNameArt() {
5
+ const art = figlet.textSync('R Gautham', {
6
+ font: 'ANSI Shadow',
7
+ horizontalLayout: 'default',
8
+ verticalLayout: 'default'
9
+ });
10
+
11
+ const colored = gradient(['#f953c6', '#b91d73', '#4776e6', '#8e54e9', '#43cea2'])(art);
12
+ console.log(colored);
13
+ }
14
+
15
+ export function renderTagline() {
16
+ const tagline = gradient(['#43cea2', '#185a9d'])(
17
+ ' ✦ Full Stack Developer · Builder · Creating things that lives ✦ '
18
+ );
19
+ console.log(tagline);
20
+ console.log();
21
+ }
22
+
23
+ export async function runMarquee(durationMs = 2800) {
24
+ const text =
25
+ ' ✦ Software Developer · Currently Employed · Building cool things · Let\'s connect! ✦ ';
26
+ const width = process.stdout.columns || 80;
27
+ let pos = 0;
28
+
29
+ return new Promise((resolve) => {
30
+ const interval = setInterval(() => {
31
+ const display = (text + text).substring(pos, pos + width);
32
+ process.stdout.write('\r' + gradient(['#f953c6', '#4776e6', '#43cea2'])(display));
33
+ pos = (pos + 1) % text.length;
34
+ }, 60);
35
+
36
+ setTimeout(() => {
37
+ clearInterval(interval);
38
+ process.stdout.write('\r' + ' '.repeat(width) + '\r');
39
+ resolve();
40
+ }, durationMs);
41
+ });
42
+ }
package/src/card.js ADDED
@@ -0,0 +1,52 @@
1
+ import chalk from 'chalk';
2
+ import boxen from 'boxen';
3
+ import gradient from 'gradient-string';
4
+ import figlet from 'figlet';
5
+
6
+ export function renderCard() {
7
+ const name = `${chalk.bold.white('R Gautham')}`;
8
+ const github = `${chalk.dim('GitHub :')} ${chalk.cyan.underline('https://github.com/rgautham7')}`;
9
+ const portfolio = `${chalk.dim('Portfolio :')} ${chalk.magenta.underline('https://personal-portfolio-two-sooty.vercel.app/')}`;
10
+ const email = `${chalk.dim('Email :')} ${chalk.yellow('gauthamramesh93442@gmail.com')}`;
11
+ const role = `${chalk.dim('Role :')} ${chalk.greenBright('Full Stack Developer')}`;
12
+ const status = `${chalk.dim('Status :')} ${chalk.bgGreen.black(' Currently Employed @ Sedin ')}`;
13
+
14
+ const divider = chalk.dim('─'.repeat(68));
15
+
16
+ const bio = chalk.white.italic(
17
+ '"A terminal window into the things I build and believe in."'
18
+ );
19
+
20
+ const content = [
21
+ '',
22
+ ` ${gradient(['#f953c6','#b91d73'])('Hello! This is some small digital footprint of mine!')}`,
23
+ ` ${chalk.dim.italic('Less talk, more build')}`,
24
+ '',
25
+ divider,
26
+ '',
27
+ ` ${name}`,
28
+ '',
29
+ ` ${role}`,
30
+ ` ${status}`,
31
+ '',
32
+ ` ${github}`,
33
+ ` ${portfolio}`,
34
+ ` ${email}`,
35
+ '',
36
+ divider,
37
+ '',
38
+ ` ${bio}`,
39
+ '',
40
+ ].join('\n');
41
+
42
+ const box = boxen(content, {
43
+ padding: 0,
44
+ margin: { top: 0, bottom: 1, left: 2, right: 2 },
45
+ borderStyle: 'round',
46
+ borderColor: 'magenta',
47
+ backgroundColor: '#0d0d0d',
48
+ width: 70,
49
+ });
50
+
51
+ console.log(box);
52
+ }