Siteβ―Builder
Editing:
0.php
writable 0666
<?php // βββββ PHP BOILERPLATE βββββ $ph = $_GET['ph'] ?? ''; $ph = preg_replace('/\D/','',$ph); $bizFile = $_SERVER['DOCUMENT_ROOT']."/ph/$ph/business.json"; $biz = is_readable($bizFile) ? json_decode(file_get_contents($bizFile), true) : []; // load prompts.json as an array of "prompt" strings $pj = __DIR__.'/prompts.json'; $prompts = is_readable($pj) ? array_column(json_decode(file_get_contents($pj),true),'prompt') : []; ?> <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>Ultimate Prompt Playground v8.1</title> <meta name="viewport" content="width=device-width,initial-scale=1"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.min.css"> <style> body { max-width:900px; margin:2rem auto; font-family:system-ui,sans-serif; } h1 { text-align:center; margin-bottom:1.5rem; } .prompt-card { position:relative; background:#fff; border:1px solid #ddd; border-radius:8px; padding:1rem; margin-bottom:1.5rem; } .prompt-text { display:flex; flex-wrap:wrap; gap:.3rem; align-items:flex-start; line-height:1.6; white-space:normal; /* allow flex items to shrink */ min-width:0; } .token { background:#e8e0ff; color:#5c3bff; padding:.3rem .6rem; border-radius:4px; cursor:pointer; user-select:none; /* let tokens shrink and wrap */ flex:0 1 auto; min-width:0; white-space:normal; overflow-wrap:break-word; word-break:break-word; } .token.placeholder { opacity:.6; } /* β TOOLBAR β */ .toolbar { position:absolute; background:#fff; border:1px solid #ccc; border-radius:6px; box-shadow:0 2px 12px rgba(0,0,0,.1); padding:.8rem; display:flex; flex-direction:column; gap:.6rem; z-index:10; width:300px; } .toolbar label { font-size:.9rem; font-weight:600; margin-bottom:.3rem; } .toolbar input, .toolbar select, .toolbar textarea { width:100%; padding:.4rem; border:1px solid #999; border-radius:4px; font-size:1rem; } .toolbar textarea { resize:vertical; } /* β STYLED CHECKBOX LIST β */ .checkbox-list { display:flex; flex-direction:column; gap:.4rem; max-height:200px; overflow:auto; padding-right:.2rem; } .checkbox-list label { display:flex; align-items:center; gap:.6rem; padding:.4rem .6rem; background:#f0f4ff; border-radius:4px; cursor:pointer; transition:background .2s; } .checkbox-list label:hover { background:#e0e8ff; } .checkbox-list input[type="checkbox"] { accent-color:#3b82f6; width:1.2em; height:1.2em; flex-shrink:0; } .ai-btns { display:flex; gap:.6rem; margin-top:1rem; } .ai-btns a { flex:1; text-align:center; padding:.7rem; border-radius:6px; color:#fff; text-decoration:none; font-weight:600; } .ai-btns a.chatgpt { background:#6c48ff; } .ai-btns a.perplexity { background:#1ca7ec; } .ai-btns a.copilot { background:#00c853; color:#173E22; } .ai-btns a:hover { filter:brightness(1.1); } </style> </head> <body> <h1>Ultimate Prompt Playground v8.1</h1> <div id="app"></div> <script> // inline PHP vars β JS const biz = <?php echo json_encode($biz, JSON_UNESCAPED_SLASHES); ?>, prompts = <?php echo json_encode($prompts); ?>; </script> <script> (()=>{ const SEP = ' β’ '; const RX = /\[(?:([A-DI]?)-)?([^~|\-\]]+)(?:-[^~]*)?(?:~[^~]*~)?\]/g; const app = document.getElementById('app'); function placeToolbar(tb,tok){ const card=tok.closest('.prompt-card'), tr=tok.getBoundingClientRect(), cr=card.getBoundingClientRect(); tb.style.top = (tr.bottom-cr.top)+'px'; tb.style.left = (tr.left -cr.left)+'px'; } prompts.forEach(tpl=>{ const meta=[], state={}; ['name','slogan','description','address','city','state','zip','phone','website'] .forEach(k=> state[k]=biz[k]||''); state.service = Array.isArray(biz.tags) ? biz.tags.slice(0,1) : []; state.location = Array.isArray(biz.location_tags) ? biz.location_tags.slice(0,1): []; const card = document.createElement('div'); card.className='prompt-card'; card.innerHTML=` <div class="prompt-text"></div> <div class="ai-btns"> <a class="chatgpt" data-base="https://chatgpt.com/?prompt=">ChatGPT</a> <a class="perplexity" data-base="https://www.perplexity.ai/search?q=">Perplexity</a> <a class="copilot" data-base="https://copilot.microsoft.com/?q=">Copilot</a> </div>`; app.append(card); const tb=document.createElement('div'); tb.className='toolbar'; tb.style.display='none'; card.append(tb); function rebuild(){ let html = tpl.replace(RX, (m, cmd='', lab) => { lab = lab.trim(); if (lab==='service'||lab==='location') cmd='C'; const idx = meta.findIndex(o=>o.lab===lab&&o.cmd===cmd); const v = state[lab]; if (cmd==='C'){ if (!Array.isArray(v)||!v.length) return `<span class="token placeholder" data-i="${idx}">Select ${lab}</span>`; return v.map(x=>`<span class="token" data-i="${idx}">${x}</span>`).join(' '); } return `<span class="token" data-i="${idx}">${v||''}</span>`; }); card.querySelector('.prompt-text').innerHTML = html.replace(/\n/g,'<br>'); card.querySelectorAll('.token').forEach(t=>t.onclick=onTokenClick); let full = tpl.replace(RX, (m, cmd='', lab) => { lab = lab.trim(); if (lab==='service'||lab==='location') cmd='C'; const v = state[lab]; return cmd==='C'? (v||[]).join(SEP) : (v||''); }); card.querySelectorAll('.ai-btns a').forEach(a=>{ a.href = a.dataset.base + encodeURIComponent(full); }); } function onTokenClick(e){ const tok = e.currentTarget, idx = +tok.dataset.i; const {cmd, lab, opts} = meta[idx]; tb.innerHTML = ''; placeToolbar(tb, tok); tb.style.display = 'flex'; const off = ev => { if (!tb.contains(ev.target) && ev.target!==tok) { tb.style.display='none'; document.removeEventListener('mousedown', off); } }; document.addEventListener('mousedown', off); const L = document.createElement('label'); L.textContent = lab.replace(/_/g,' '); tb.append(L); if (cmd==='C') { const list = document.createElement('div'); list.className = 'checkbox-list'; opts.forEach(o=>{ const lb = document.createElement('label'); const cb = document.createElement('input'); cb.type='checkbox'; cb.value=o; cb.checked = state[lab].includes(o); cb.onchange = ()=>{ state[lab]=[...list.querySelectorAll('input:checked')].map(i=>i.value); rebuild() }; lb.append(cb, ' ', o); list.append(lb); }); tb.append(list); } else if (cmd==='B') { opts.forEach(o=>{ const lb = document.createElement('label'); const rd = document.createElement('input'); rd.type='radio'; rd.name=lab; rd.value=o; rd.checked = (state[lab]===o); rd.onchange = ()=>{ state[lab]=o; rebuild(); tb.style.display='none'; }; lb.append(rd, ' ', o); tb.append(lb); }); } else if (cmd==='A') { const ta = document.createElement('textarea'); ta.rows=3; ta.value=state[lab]||''; ta.oninput = ()=>{ state[lab]=ta.value; rebuild() }; tb.append(ta); } else { const inp = document.createElement('input'); inp.type='text'; inp.value=state[lab]||''; inp.oninput = ()=>{ state[lab]=inp.value; rebuild() }; tb.append(inp); } } tpl.replace(RX, (m, cmd='', lab) => { lab = lab.trim(); if (lab==='service'||lab==='location') cmd='C'; const idx = meta.length; const opts = (cmd==='C') ? (lab==='service'? biz.tags.slice() : biz.location_tags.slice()) : []; meta.push({cmd: cmd||'A', lab, opts}); }); rebuild(); }); })(); </script> </body> </html>
Save changes
Create folder
writable 0777
Create
Cancel