UNPKG

namastejs

Version:

A spiritual greeting from your JavaScript code. Because every function deserves a 'Namaste šŸ™'

133 lines (105 loc) • 3 kB
#!/usr/bin/env node const { style } = require("../../theme"); const games = [ { key: "snake", name: "šŸ Snake", description: "Classic snake with smooth controls", }, { key: "typing-rain", name: "āŒØļø Typing Rain", description: "Improve typing speed while letters fall", }, { key: "invaders", name: "šŸ‘¾ Space Invaders", description: "Defend earth from ASCII aliens", }, ]; let selectedIndex = 0; /* ───────── Terminal Helpers ───────── */ function clear() { process.stdout.write("\x1Bc"); } function hideCursor() { process.stdout.write("\x1b[?25l"); } function showCursor() { process.stdout.write("\x1b[?25h"); } /* ───────── Render Menu ───────── */ function renderMenu() { clear(); console.log( style.gold(` ╔══════════════════════════════════╗ ā•‘ šŸŽ® NAMASTE GAMES šŸŽ® ā•‘ ā•šā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā•ā• `) ); games.forEach((game, index) => { const isSelected = index === selectedIndex; if (isSelected) { console.log( style.bgBrightGreen(style.black(` ā–¶ ${game.name.padEnd(18)} `)) + style.gray(` ${game.description}`) ); } else { console.log( ` ${style.white(game.name.padEnd(18))} ${style.gray( game.description )}` ); } }); console.log( style.cyan(` ──────────────────────────────────── ↑ ↓ Navigate Enter Play Ctrl+C Exit `) ); } /* ───────── Start Selected Game ───────── */ function startGame(gameKey) { // Stop menu input process.stdin.removeAllListeners("data"); process.stdin.setRawMode(false); process.stdin.pause(); showCursor(); clear(); // Load game directly require(`./${gameKey}`); } /* ───────── Input Handling ───────── */ function handleKeypress(buffer) { const key = buffer.toString(); if (key === "\u0003") { showCursor(); clear(); process.exit(0); } if (key === "\u001B[A") { // Up selectedIndex = (selectedIndex - 1 + games.length) % games.length; renderMenu(); } if (key === "\u001B[B") { // Down selectedIndex = (selectedIndex + 1) % games.length; renderMenu(); } if (key === "\r") { // Enter startGame(games[selectedIndex].key); } } /* ───────── Boot ───────── */ function startMenu() { hideCursor(); renderMenu(); process.stdin.setRawMode(true); process.stdin.resume(); process.stdin.on("data", handleKeypress); } startMenu();