generated from nhcarrigan/template
feat: add clipboard history for code snippets
Implements issue #25 - Clipboard History feature that tracks copied code snippets with language detection, search, and filtering. Backend (Rust): - New clipboard.rs module with persistent storage via tauri-plugin-store - Commands: capture, list, delete, toggle pin, clear, search, update language - Auto-deduplication and max history size (100 entries) - Pinned entries stay at top and persist through clear Frontend (Svelte/TypeScript): - Clipboard store with filtering, search, and language detection - ClipboardHistoryPanel component with search, language filter, pin/delete - Clipboard button added to InputBar next to Snippets/Actions - Auto-capture from code block copy buttons - Auto-capture from manual text selection in terminal - Insert snippets directly into input field Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,10 +1,11 @@
|
||||
<script lang="ts">
|
||||
import { claudeStore, type TerminalLine } from "$lib/stores/claude";
|
||||
import { afterUpdate, tick } from "svelte";
|
||||
import { afterUpdate, tick, onMount, onDestroy } from "svelte";
|
||||
import ConversationTabs from "./ConversationTabs.svelte";
|
||||
import Markdown from "./Markdown.svelte";
|
||||
import HighlightedText from "./HighlightedText.svelte";
|
||||
import { searchState, searchQuery } from "$lib/stores/search";
|
||||
import { clipboardStore } from "$lib/stores/clipboard";
|
||||
|
||||
let terminalElement: HTMLDivElement;
|
||||
let shouldAutoScroll = true;
|
||||
@@ -122,6 +123,32 @@
|
||||
searchState.setMatchCount(0);
|
||||
}
|
||||
}
|
||||
|
||||
// Handle manual text selection copy events
|
||||
function handleCopy() {
|
||||
const selection = window.getSelection();
|
||||
const selectedText = selection?.toString();
|
||||
|
||||
if (selectedText && selectedText.trim().length > 0) {
|
||||
// Only capture multi-line or longer text (likely code/meaningful content)
|
||||
if (selectedText.includes("\n") || selectedText.length > 50) {
|
||||
clipboardStore.captureClipboard(selectedText, null, "Copied from chat");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onMount(() => {
|
||||
// Listen for copy events on the terminal
|
||||
if (terminalElement) {
|
||||
terminalElement.addEventListener("copy", handleCopy);
|
||||
}
|
||||
});
|
||||
|
||||
onDestroy(() => {
|
||||
if (terminalElement) {
|
||||
terminalElement.removeEventListener("copy", handleCopy);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<div
|
||||
|
||||
Reference in New Issue
Block a user