diff --git a/internal/web/templates/new.html b/internal/web/templates/new.html
index 529168b..111de35 100644
--- a/internal/web/templates/new.html
+++ b/internal/web/templates/new.html
@@ -66,16 +66,6 @@
Result
@@ -154,21 +144,6 @@ $('pwreveal').addEventListener('click', () => {
$('pwreveal').title = show ? 'Hide password' : 'Show password';
});
-// #4: can builder — multiple text items bundled into one shareable page.
-// The main editor becomes the first item; extra items are added below.
-$('iscan').addEventListener('change', e => {
- $('canrow').style.display = e.target.checked ? 'block' : 'none';
- if (e.target.checked && !$('can-items').children.length) addCanItem();
-});
-function addCanItem() {
- const row = document.createElement('div');
- row.className = 'can-item-row';
- row.innerHTML = '
' +
- '
';
- $('can-items').appendChild(row);
-}
-$('can-add').addEventListener('click', addCanItem);
-
let guessed = ''; // last auto-detected language, '' = user override
// #105: map backend machine-readable error codes to plain-language guidance.
@@ -248,8 +223,6 @@ $('reguess').addEventListener('click', guessLang);
content.addEventListener('paste', () => setTimeout(guessLang, 0));
async function create() {
- // #4: can mode — bundle the editor + extra items into a can via multipart
- if ($('iscan').checked) return createCan();
const body = {
content: content.value,
@@ -307,61 +280,6 @@ async function create() {
}
$('create').addEventListener('click', create);
-// #4: can creation — POST multipart to /api/pastes/can. The main editor is
-// the first item; each extra can-item row is another text item.
-async function createCan() {
- const items = [];
- if (content.value.trim()) {
- items.push({title: $('title').value || 'main', content: content.value, language: $('language').value || ''});
- }
- document.querySelectorAll('#can-items .can-item-row').forEach(row => {
- const t = row.querySelector('.can-item-title').value.trim();
- const c = row.querySelector('.can-item-content').value;
- if (c.trim()) items.push({title: t || ('item-' + (items.length + 1)), content: c});
- });
- if (!items.length) { toast('Nothing to put in the can', 'error'); return; }
-
- const fd = new FormData();
- fd.append('title', $('title').value || 'Untitled can');
- fd.append('json_items', JSON.stringify(items));
- if ($('haspw').checked) fd.append('password', $('password').value);
- if ($('unlisted').checked) fd.append('visibility', 'unlisted');
- const exp = document.querySelector('input[name="exp"]:checked').value;
- if (exp === 'custom') {
- const dur = composeCustomExpiry();
- if (dur === null) { toast('Check the custom expiry', 'error'); return; }
- if (dur) fd.append('expires_in', dur);
- } else if (exp) {
- fd.append('expires_in', exp);
- }
- if ($('custom').value.trim()) fd.append('custom_slug', $('custom').value.trim());
-
- const res = await fetch('/api/pastes/can', {method: 'POST', body: fd});
- const data = await res.json();
- if (!res.ok) {
- showResult(friendlyError(data), 'err');
- toast('Can create failed', 'error');
- return;
- }
- const url = location.origin + data.url;
- showResult('
' + url + ' ', 'ok');
- const copyBtn = document.getElementById('result-copy');
- copyBtn.addEventListener('click', () => {
- try {
- navigator.clipboard.writeText(url);
- copyBtn.classList.add('ok');
- copyBtn.textContent = 'Success!';
- setTimeout(() => { copyBtn.classList.remove('ok'); copyBtn.textContent = '⧉'; }, 2000);
- } catch(e) { toast('Copy failed', 'error'); }
- });
- // password-protected can: unlock now with the password we already have (#26 parity)
- if ($('haspw').checked && data.id) {
- const pd = new FormData();
- pd.append('password', $('password').value);
- try { await fetch('/can/' + data.id, {method: 'POST', body: pd}); } catch(e) {}
- }
- location.href = data.url;
-}
// reset stale result state when returning via Back (bfcache) (#28)
window.addEventListener('pageshow', e => {
if (!e.persisted) return;