Completed
on 3 Jan 2026, 11:40 pm

Output

Claude Code Paste Placeholder UX

The Claude Code CLI uses a clever technique to handle large pastes:

How It Works

  1. Intercept paste event - Listen for paste event on the input
  2. Count lines - Check if pasted text exceeds a threshold (e.g., 5+ lines)
  3. Store full text - Save the actual pasted content in a hidden variable/data attribute
  4. Show placeholder - Replace input display with [Pasted text #1 +87 lines]
  5. On submit - Send the actual stored text, not the placeholder

Implementation Sketch

let pastedTexts = [];

input.addEventListener('paste', (e) => {
  const text = e.clipboardData.getData('text');
  const lines = text.split('\n').length;
  
  if (lines > 5) {
    e.preventDefault();
    pastedTexts.push(text);
    const placeholder = `[Pasted #${pastedTexts.length} +${lines} lines]`;
    // Insert placeholder at cursor position
    insertAtCursor(input, placeholder);
  }
});

// On submit, expand placeholders back to full text
function getFullPrompt() {
  let prompt = input.value;
  pastedTexts.forEach((text, i) => {
    prompt = prompt.replace(
      new RegExp(`\\[Pasted #${i+1}.*?\\]`),
      text
    );
  });
  return prompt;
}

Benefits:

  • Input stays compact and readable
  • User can still type around the placeholder
  • Multiple pastes are numbered
  • Full content sent on submit

What's Next?

Choose an action:

Quick Actions

Original Request

No layout configured

Details

Type General
Status Completed
Scope vibetools
Tags consoleuiuxresearch
Created 3 Jan 2026, 11:40 pm
Updated 3 Jan 2026, 11:40 pm
Created By claude

Raw Data

{
  "id": "7ddc4963-06a9-4101-b250-172e39fbfdc7",
  "type": "general",
  "status": "completed",
  "title": "Claude Code Paste Placeholder UX",
  "description": "Explanation of how Claude Code handles large pastes with placeholders",
  "context": {
    "output": "<div style=\"background:#1e1e1e;color:#e0e0e0;padding:20px;border-radius:8px;font-family:sans-serif;\">\n<h2 style=\"color:#fff;margin:0 0 16px 0;\">Claude Code Paste Placeholder UX</h2>\n\n<p style=\"color:#9ca3af;margin-bottom:20px;\">The Claude Code CLI uses a clever technique to handle large pastes:</p>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h4 style=\"color:#daa520;margin:0 0 12px 0;\">How It Works</h4>\n<ol style=\"margin:0;padding-left:20px;color:#e0e0e0;line-height:1.8;\">\n<li><strong>Intercept paste event</strong> - Listen for <code style=\"background:#3d3d3d;padding:2px 6px;border-radius:3px;\">paste</code> event on the input</li>\n<li><strong>Count lines</strong> - Check if pasted text exceeds a threshold (e.g., 5+ lines)</li>\n<li><strong>Store full text</strong> - Save the actual pasted content in a hidden variable/data attribute</li>\n<li><strong>Show placeholder</strong> - Replace input display with <code style=\"background:#3d3d3d;padding:2px 6px;border-radius:3px;color:#4ade80;\">[Pasted text #1 +87 lines]</code></li>\n<li><strong>On submit</strong> - Send the actual stored text, not the placeholder</li>\n</ol>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h4 style=\"color:#4ade80;margin:0 0 12px 0;\">Implementation Sketch</h4>\n<pre style=\"background:#1a1a2e;padding:12px;border-radius:4px;overflow-x:auto;font-size:0.85rem;margin:0;color:#e0e0e0;\"><span style=\"color:#c678dd;\">let</span> <span style=\"color:#e5c07b;\">pastedTexts</span> = [];\n\n<span style=\"color:#e5c07b;\">input</span>.<span style=\"color:#61afef;\">addEventListener</span>(<span style=\"color:#98c379;\">'paste'</span>, (e) => {\n  <span style=\"color:#c678dd;\">const</span> <span style=\"color:#e5c07b;\">text</span> = e.clipboardData.<span style=\"color:#61afef;\">getData</span>(<span style=\"color:#98c379;\">'text'</span>);\n  <span style=\"color:#c678dd;\">const</span> <span style=\"color:#e5c07b;\">lines</span> = text.<span style=\"color:#61afef;\">split</span>(<span style=\"color:#98c379;\">'\\n'</span>).length;\n  \n  <span style=\"color:#c678dd;\">if</span> (lines > <span style=\"color:#d19a66;\">5</span>) {\n    e.<span style=\"color:#61afef;\">preventDefault</span>();\n    <span style=\"color:#e5c07b;\">pastedTexts</span>.<span style=\"color:#61afef;\">push</span>(text);\n    <span style=\"color:#c678dd;\">const</span> <span style=\"color:#e5c07b;\">placeholder</span> = <span style=\"color:#98c379;\">`[Pasted #${pastedTexts.length} +${lines} lines]`</span>;\n    <span style=\"color:#7f848e;\">// Insert placeholder at cursor position</span>\n    <span style=\"color:#61afef;\">insertAtCursor</span>(input, placeholder);\n  }\n});\n\n<span style=\"color:#7f848e;\">// On submit, expand placeholders back to full text</span>\n<span style=\"color:#c678dd;\">function</span> <span style=\"color:#61afef;\">getFullPrompt</span>() {\n  <span style=\"color:#c678dd;\">let</span> <span style=\"color:#e5c07b;\">prompt</span> = input.value;\n  <span style=\"color:#e5c07b;\">pastedTexts</span>.<span style=\"color:#61afef;\">forEach</span>((text, i) => {\n    prompt = prompt.<span style=\"color:#61afef;\">replace</span>(\n      <span style=\"color:#c678dd;\">new</span> <span style=\"color:#e5c07b;\">RegExp</span>(<span style=\"color:#98c379;\">`\\\\[Pasted #${i+1}.*?\\\\]`</span>),\n      text\n    );\n  });\n  <span style=\"color:#c678dd;\">return</span> prompt;\n}</pre>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;border-left:4px solid #daa520;\">\n<p style=\"margin:0;color:#e0e0e0;\"><strong>Benefits:</strong></p>\n<ul style=\"margin:8px 0 0 0;padding-left:20px;color:#9ca3af;\">\n<li>Input stays compact and readable</li>\n<li>User can still type around the placeholder</li>\n<li>Multiple pastes are numbered</li>\n<li>Full content sent on submit</li>\n</ul>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-top:16px;\">\n<h4 style=\"margin:0 0 8px 0;color:#fff;\">What's Next?</h4>\n<p style=\"color:#9ca3af;margin:0;\">Choose an action:</p>\n</div>\n</div>",
    "choices": [
      {
        "label": "Implement this",
        "value": "Implement paste placeholder feature for the dashboard console input",
        "primary": true
      },
      {
        "label": "Backlog it",
        "value": "Add paste placeholder feature to the backlog for later implementation"
      },
      {
        "label": "Commit current work",
        "value": "Commit and push all the current status bar changes first"
      }
    ],
    "requestedAt": "2026-01-03T13:42:00.000Z",
    "requestId": "48d10d48-e31d-4517-b4a0-c16005c0cbdb"
  },
  "createdBy": "claude",
  "createdAt": "2026-01-03T13:40:20.560Z",
  "updatedAt": "2026-01-03T13:40:20.725Z",
  "requestId": "48d10d48-e31d-4517-b4a0-c16005c0cbdb",
  "scope": "vibetools",
  "tags": [
    "console",
    "ui",
    "ux",
    "research"
  ],
  "targetUser": "claude"
}
DashboardReportsKontasksSessionsTelemetryLogs + Go