Adjust typing animation and command display spacing

Refactor HTML structure for command input to use a single inline container with `white-space: pre` to precisely control spacing, and adjust JavaScript to add a trailing space to the typed text and increase the pause before the enter key press in the auto-type animation.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 6def8112-39d2-4641-b93b-f39108179f33
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 3f816ee5-1289-41ac-aa73-2bd1494876d3
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/42ae33dd-8759-4196-85a5-434465c72ece/6def8112-39d2-4641-b93b-f39108179f33/roUqm0y
Replit-Helium-Checkpoint-Created: true
This commit is contained in:
keshavananddev
2026-04-24 03:55:18 +00:00
parent 4d0c742b02
commit 8b307b42b3
3 changed files with 19 additions and 16 deletions

View File

@@ -14,7 +14,7 @@
<main class="stage"> <main class="stage">
<div class="command-box" id="commandBox"> <div class="command-box" id="commandBox">
<span class="dollar">$</span><span class="typed" id="typed"></span><span class="prompt-space" aria-hidden="true"> </span><span class="user-input" id="userInput"></span><span class="caret" id="caret" aria-hidden="true"></span> <span class="line"><span class="dollar">$ </span><span class="typed" id="typed"></span><span class="user-input" id="userInput"></span><span class="caret" id="caret" aria-hidden="true"></span></span>
<button class="action-btn" id="actionBtn" aria-label="Copy to clipboard"> <button class="action-btn" id="actionBtn" aria-label="Copy to clipboard">
<svg id="actionIcon" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"> <svg id="actionIcon" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path id="iconPath" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" /> <path id="iconPath" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" />

View File

@@ -57,7 +57,8 @@ function typeIntro(target: string, onDone?: () => void) {
function nextChar() { function nextChar() {
if (i >= target.length) { if (i >= target.length) {
typedEl.textContent = resolved; // append a trailing space so the caret rests one char past the prompt
typedEl.textContent = resolved + ' ';
onDone?.(); onDone?.();
return; return;
} }
@@ -81,7 +82,7 @@ function typeIntro(target: string, onDone?: () => void) {
} }
if (reduceMotion) { if (reduceMotion) {
typedEl.textContent = COMMAND; typedEl.textContent = COMMAND + ' ';
inputEnabled = true; inputEnabled = true;
} else { } else {
setTimeout(() => typeIntro(COMMAND, () => { setTimeout(() => typeIntro(COMMAND, () => {
@@ -254,8 +255,8 @@ async function autoTypeHelp() {
await sleep(60); await sleep(60);
} }
// PHASE 3 — quick read pause + ripple from the box itself // PHASE 3 — let the user read "-h" before it fires, then ripple from the box
await sleep(220); await sleep(850);
const boxRect = commandBox.getBoundingClientRect(); const boxRect = commandBox.getBoundingClientRect();
spawnRipple(boxRect.right - 24, boxRect.top + boxRect.height / 2); spawnRipple(boxRect.right - 24, boxRect.top + boxRect.height / 2);

View File

@@ -71,15 +71,24 @@ body {
color: var(--fg); color: var(--fg);
display: flex; display: flex;
align-items: center; align-items: center;
gap: 0.6rem; gap: 0;
cursor: text; cursor: text;
user-select: none; user-select: none;
transition: border-color 200ms ease, box-shadow 200ms ease; transition: border-color 200ms ease, box-shadow 200ms ease;
position: relative; position: relative;
white-space: nowrap;
overflow: hidden; overflow: hidden;
} }
/* one inline container for all the prompt text — keeps spacing exact */
.line {
flex: 1 1 auto;
min-width: 0;
white-space: pre;
overflow: hidden;
text-overflow: clip;
display: block;
}
.command-box:hover { .command-box:hover {
border-color: var(--accent-soft); border-color: var(--accent-soft);
} }
@@ -126,21 +135,14 @@ body {
.dollar { .dollar {
color: var(--accent); color: var(--accent);
font-weight: 600; font-weight: 600;
flex-shrink: 0;
} }
.typed { .typed {
color: var(--fg); color: var(--fg);
white-space: pre;
}
.prompt-space {
white-space: pre;
} }
.user-input { .user-input {
color: var(--fg); color: var(--fg);
white-space: pre;
} }
/* a real terminal block caret — exactly one monospace char wide, no offset */ /* a real terminal block caret — exactly one monospace char wide, no offset */
@@ -160,7 +162,7 @@ body {
} }
.action-btn { .action-btn {
margin-left: auto; margin-left: 0.6rem;
background: none; background: none;
border: none; border: none;
color: var(--dim); color: var(--dim);
@@ -169,7 +171,7 @@ body {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
flex-shrink: 0; flex: 0 0 auto;
transition: color 180ms ease, transform 180ms ease; transition: color 180ms ease, transform 180ms ease;
} }