diff --git a/src/SnippetManager.js b/src/SnippetManager.js index 6926e0a..2ebf512 100644 --- a/src/SnippetManager.js +++ b/src/SnippetManager.js @@ -157,6 +157,21 @@ export class SnippetManager { } } + duplicateSnippet(id) { + const snippet = this.snippets.find(s => s.id === id); + if (!snippet) return; + + const newSnippet = { + ...snippet, + id: 'snippet-' + Date.now(), + name: snippet.name + ' (Copy)' + }; + + this.snippets.push(newSnippet); + this.saveSnippetsAndUpdateUI(); + this.loadSnippet(newSnippet.id); + } + saveSnippetsAndUpdateUI() { this.storageManager.saveSnippets(this.snippets); this.updateUI(); diff --git a/src/UIManager.js b/src/UIManager.js index 1d7fee9..12063f9 100644 --- a/src/UIManager.js +++ b/src/UIManager.js @@ -60,6 +60,11 @@ export class UIManager { e.stopPropagation(); this.snippetManager.deleteSnippet(snippet.id); })); + + buttonsDiv.appendChild(this.createButton('📄', 'duplicate-snippet', (e) => { + e.stopPropagation(); + this.snippetManager.duplicateSnippet(snippet.id); + })); div.appendChild(buttonsDiv); container.appendChild(div); diff --git a/src/styles.css b/src/styles.css index 813c0c0..9c8ea23 100644 --- a/src/styles.css +++ b/src/styles.css @@ -249,4 +249,22 @@ .snippet-item:hover .edit-snippet { opacity: 0.8; +} + +.duplicate-snippet { + opacity: 0.4; + font-size: 14px; + padding: 2px 4px; + background: none; + border: none; + cursor: pointer; + min-width: 24px; +} + +.duplicate-snippet:hover { + opacity: 1; +} + +.snippet-item:hover .duplicate-snippet { + opacity: 0.8; } \ No newline at end of file