diff --git a/src/index.html b/src/index.html index 8cce5c2..a9e936a 100644 --- a/src/index.html +++ b/src/index.html @@ -313,6 +313,8 @@ #layersFieldset { order: 40; } #designerMetadataFieldset { order: 45; } #exportFieldset { order: 50; } + #printSaveFieldset { order: 55; } + #designerPrintSaveFieldset { order: 46; } #metadataFieldset { order: 70; } #communityFieldset { order: 70; } aside > details { order: 90; } @@ -1390,17 +1392,10 @@ -
- - - - -
+
- - - +
@@ -1456,7 +1451,7 @@
Project metadata - +
- - -
-

IMDb import uses OMDb-compatible endpoint + API key. Publishing requires a Nostr extension (Alby, nos2x).

+

IMDb import uses OMDb-compatible endpoint + API key. Title and category are required to save or export.

- Export + Display options
@@ -1503,15 +1495,28 @@
+

PDF export opens your browser print dialog. Choose Save as PDF, use 100% scale, and disable headers/footers.

+
+
+ Print & Save
- +
+
+
- -

Export PDF opens your print dialog. Choose Save as PDF, use 100% scale, and disable browser headers/footers.

+
+ Nostr +
+ + + +
+

Publishing requires a Nostr browser extension (Alby, nos2x). Import restores a template from a pasted Nostr event.

+
@@ -1786,14 +1791,13 @@
Project metadata - + - +
-
-

Disc designs publish as reusable single-disc designs. Load them into any A-D slot before assigning a print sheet.

+

Title and category are required to save or publish.

+
+
+ +
+ Print & Save +
+ +
+
+ + + +
+
+ Nostr +
+ + +
+

Disc designs publish as reusable single-disc designs. Publishing requires a Nostr browser extension.

@@ -3689,6 +3713,9 @@ if (!state.meta.title?.trim()) { throw new Error('Add a title in Project Metadata before publishing.'); } + if (!state.meta.category?.trim()) { + throw new Error('Select a category in Project Metadata before publishing.'); + } let payload, typeTag; if (state.templateMode === 'disc') { payload = discSheetPayload(); @@ -3723,6 +3750,9 @@ async function publishDiscDesignToNostr(key) { const design = state.discDesigns[key]; if (!design?.src) throw new Error('Load an image URL before publishing this disc design.'); + if (!state.meta.category?.trim()) { + throw new Error('Select a category in Project Metadata before publishing.'); + } const payload = discDesignPayload(key); const designName = design.name && design.name !== `Design ${key.toUpperCase()}` ? design.name : state.meta.title; if (!designName?.trim()) { @@ -4054,6 +4084,10 @@ } function downloadProject() { + const title = (state.meta.title || '').trim(); + const category = (state.meta.category || '').trim(); + if (!title) { alert('Please enter a title in Project Metadata before saving.'); return; } + if (!category) { alert('Please select a category in Project Metadata before saving.'); return; } if (state.templateMode === 'disc') { triggerDownload(discSheetPayload(), projectFilename('disk')); } else if (state.templateMode === 'jewel') { @@ -4064,6 +4098,10 @@ } function downloadSingleDesign() { + const title = (state.meta.title || '').trim(); + const category = (state.meta.category || '').trim(); + if (!title) { alert('Please enter a title in Project Metadata before saving.'); return; } + if (!category) { alert('Please select a category in Project Metadata before saving.'); return; } const key = state.activeDiscDesign || 'a'; const design = state.discDesigns[key]; if (!design) return; @@ -4934,6 +4972,8 @@ render(); window.print(); }); + const dprint = $('designerPrintBtn'); + if (dprint) dprint.addEventListener('click', () => { render(); window.print(); }); $('saveProjectBtn').addEventListener('click', downloadProject); $('designerSaveProjectBtn').addEventListener('click', () => { @@ -5063,8 +5103,7 @@ }); $('designerNostrLoadBtn').addEventListener('click', openDiscDesignNostrSearch); - $('quickPrintBtn').addEventListener('click', () => $('printBtn').click()); - $('quickSaveBtn').addEventListener('click', () => $('saveProjectBtn').click()); + $('browseCommunityBtn').addEventListener('click', () => { $('nostrModal').classList.add('open'); switchModalTab('New'); }); $('welcomeSearchBtn').addEventListener('click', runWelcomeSearch); $('welcomeSkipBtn').addEventListener('click', dismissWelcomeModal);