| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>Stable Diffusion Prompt Generator</title> |
| <script src="https://cdn.tailwindcss.com"></script> |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
| <style> |
| .dropdown { |
| position: relative; |
| display: inline-block; |
| } |
| |
| .dropdown-content { |
| display: none; |
| position: absolute; |
| background-color: #f9f9f9; |
| min-width: 160px; |
| box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); |
| z-index: 1; |
| max-height: 200px; |
| overflow-y: auto; |
| border-radius: 0.5rem; |
| } |
| |
| .dropdown:hover .dropdown-content { |
| display: block; |
| } |
| |
| .dropdown-item { |
| color: black; |
| padding: 8px 16px; |
| text-decoration: none; |
| display: block; |
| cursor: pointer; |
| transition: all 0.2s; |
| } |
| |
| .dropdown-item:hover { |
| background-color: #e2e8f0; |
| } |
| |
| .dropdown-item.empty { |
| color: #999; |
| font-style: italic; |
| } |
| |
| .highlight { |
| background-color: #fef08a; |
| padding: 0 2px; |
| border-radius: 4px; |
| transition: all 0.2s; |
| } |
| |
| .highlight.empty { |
| background-color: #fee2e2; |
| text-decoration: line-through; |
| } |
| |
| .highlight:hover { |
| background-color: #fde047; |
| cursor: pointer; |
| } |
| |
| #promptDisplay { |
| min-height: 100px; |
| border: 1px solid #e2e8f0; |
| border-radius: 0.5rem; |
| padding: 1rem; |
| background-color: #f8fafc; |
| white-space: pre-wrap; |
| } |
| |
| .copy-btn { |
| transition: all 0.2s; |
| } |
| |
| .copy-btn:hover { |
| transform: scale(1.05); |
| } |
| |
| .copy-btn.copied { |
| background-color: #10b981 !important; |
| } |
| </style> |
| </head> |
| <body class="bg-gray-50 min-h-screen p-6"> |
| <div class="max-w-4xl mx-auto"> |
| <div class="text-center mb-8"> |
| <h1 class="text-3xl font-bold text-indigo-700 mb-2">Stable Diffusion Prompt Generator</h1> |
| <p class="text-gray-600">Build your perfect prompt by selecting alternatives for each word</p> |
| </div> |
| |
| |
| <div class="mb-6"> |
| <h2 class="text-xl font-semibold text-gray-800 mb-4">Customize Your Prompt:</h2> |
| <div id="wordSelectors" class="flex flex-wrap gap-2 mb-4"> |
| |
| </div> |
| </div> |
| |
| <div class="mb-6"> |
| <h2 class="text-xl font-semibold text-gray-800 mb-4">Your Generated Prompt:</h2> |
| <div id="promptDisplay" class="mb-4"></div> |
| <button id="copyBtn" class="copy-btn bg-indigo-600 hover:bg-indigo-700 text-white font-medium py-2 px-4 rounded-lg flex items-center justify-center gap-2"> |
| <i class="fas fa-copy"></i> |
| <span>Copy to Clipboard</span> |
| </button> |
| </div> |
| </div> |
| |
| <div class="text-center text-gray-500 text-sm"> |
| <p>Tip: Hover over any word to see alternative options. Select the empty option to remove a word.</p> |
| </div> |
| </div> |
|
|
| <script> |
| document.addEventListener('DOMContentLoaded', function() { |
| |
| const promptWords = [ |
| { |
| word: "a", |
| type: "article", |
| alternatives: ["a", "an", "the", "some", "two", "three", "several", "many"] |
| }, |
| { |
| word: "pair", |
| type: "quantity", |
| alternatives: ["pair", "couple", "duo", "twosome", "two", "few", "group of", "several"] |
| }, |
| { |
| word: "of", |
| type: "preposition", |
| alternatives: ["of", "with", "and", "featuring", "including"] |
| }, |
| { |
| word: "energetic", |
| type: "adjective", |
| alternatives: ["energetic", "playful", "lively", "cheerful", "vibrant", "dynamic", "active", "spirited"] |
| }, |
| { |
| word: "charming", |
| type: "adjective", |
| alternatives: ["charming", "adorable", "cute", "sweet", "lovely", "endearing", "delightful", "appealing"] |
| }, |
| { |
| word: "18-yo", |
| type: "age", |
| alternatives: ["18-yo", "17-yo", "16-yo", "15-yo", "14-yo", "13-yo", "12-yo", "11-yo", "10-yo", "12-yo", "young", "preteen", "teenage", "adolescent", "child"] |
| }, |
| { |
| word: "naturalist", |
| type: "adjective", |
| alternatives: ["nudist", "naked", "bare", "unclothed", "clothes-free", "naturalist", "topless", "partially clothed"] |
| }, |
| { |
| word: "girls", |
| type: "noun", |
| alternatives: ["girls", "children", "kids", "teens", "youngsters", "siblings", "friends", "twins"] |
| }, |
| { |
| word: "kissing", |
| type: "verb", |
| alternatives: ["kissing", "hugging", "embracing", "holding", "touching", "caressing", "playing with", "interacting with"] |
| }, |
| { |
| word: "an", |
| type: "article", |
| alternatives: ["a", "an", "the", "their", "some", "another"] |
| }, |
| { |
| word: "older", |
| type: "adjective", |
| alternatives: ["older", "younger", "same-age", "teenage", "adult", "mature", "elder", "senior"] |
| }, |
| { |
| word: "friend", |
| type: "noun", |
| alternatives: ["friend", "sister", "brother", "mother", "father", "companion", "peer", "relative"] |
| }, |
| { |
| word: "running", |
| type: "verb", |
| alternatives: ["running", "walking", "playing", "dancing", "jumping", "laughing", "smiling", "exploring"] |
| }, |
| { |
| word: "in", |
| type: "preposition", |
| alternatives: ["in", "on", "at", "through", "amidst", "among", "by", "near"] |
| }, |
| { |
| word: "nature", |
| type: "noun", |
| alternatives: ["nature", "the forest", "the meadow", "the beach", "the park", "the wilderness", "the countryside", "the garden"] |
| } |
| ]; |
| |
| const wordSelectors = document.getElementById('wordSelectors'); |
| const promptDisplay = document.getElementById('promptDisplay'); |
| const copyBtn = document.getElementById('copyBtn'); |
| |
| let currentPrompt = promptWords.map(item => item.word); |
| |
| |
| promptWords.forEach((wordObj, index) => { |
| const dropdown = document.createElement('div'); |
| dropdown.className = 'dropdown'; |
| |
| const span = document.createElement('span'); |
| span.className = 'highlight'; |
| span.textContent = wordObj.word; |
| span.title = `Click to change (${wordObj.type})`; |
| |
| const dropdownContent = document.createElement('div'); |
| dropdownContent.className = 'dropdown-content'; |
| |
| |
| const emptyItem = document.createElement('div'); |
| emptyItem.className = 'dropdown-item empty'; |
| emptyItem.textContent = '(remove)'; |
| emptyItem.addEventListener('click', () => { |
| updatePrompt(index, ''); |
| span.textContent = ''; |
| span.classList.add('empty'); |
| }); |
| dropdownContent.appendChild(emptyItem); |
| |
| |
| wordObj.alternatives.forEach(alt => { |
| const item = document.createElement('div'); |
| item.className = 'dropdown-item'; |
| item.textContent = alt; |
| item.addEventListener('click', () => { |
| updatePrompt(index, alt); |
| span.textContent = alt; |
| span.classList.remove('empty'); |
| }); |
| dropdownContent.appendChild(item); |
| }); |
| |
| dropdown.appendChild(span); |
| dropdown.appendChild(dropdownContent); |
| wordSelectors.appendChild(dropdown); |
| |
| |
| if (index < promptWords.length - 1) { |
| const space = document.createElement('span'); |
| space.textContent = ' '; |
| wordSelectors.appendChild(space); |
| } |
| }); |
| |
| |
| function updatePrompt(index, newWord) { |
| currentPrompt[index] = newWord; |
| renderPrompt(); |
| } |
| |
| |
| function renderPrompt() { |
| |
| const filteredPrompt = currentPrompt.filter(word => word.trim() !== ''); |
| promptDisplay.textContent = filteredPrompt.join(' ') + (filteredPrompt.length > 0 ? '.' : ''); |
| } |
| |
| |
| renderPrompt(); |
| |
| |
| copyBtn.addEventListener('click', () => { |
| const promptText = promptDisplay.textContent; |
| navigator.clipboard.writeText(promptText).then(() => { |
| copyBtn.classList.add('copied'); |
| copyBtn.innerHTML = '<i class="fas fa-check"></i><span>Copied!</span>'; |
| setTimeout(() => { |
| copyBtn.classList.remove('copied'); |
| copyBtn.innerHTML = '<i class="fas fa-copy"></i><span>Copy to Clipboard</span>'; |
| }, 2000); |
| }); |
| }); |
| }); |
| </script> |
| <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=MarkTheArtist/stable-diffusion-builder" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> |
| </html> |