diff --git a/css/styles.css b/css/styles.css index 798be34..0ea5417 100644 --- a/css/styles.css +++ b/css/styles.css @@ -8,6 +8,7 @@ /* Tabs */ .tabs { + margin-top: var(--space-4); margin-bottom: var(--space-4); } @@ -80,3 +81,16 @@ .chip-group.mb-4 { margin-bottom: var(--space-4); } + +/* Spacing utilities */ +.mb-4 { + margin-bottom: var(--space-4); +} + +.mt-4 { + margin-top: var(--space-4); +} + +.mt-2 { + margin-top: var(--space-2); +} diff --git a/js/app.js b/js/app.js index 671af30..8a2a767 100644 --- a/js/app.js +++ b/js/app.js @@ -355,15 +355,63 @@ artists, mode, }; - const blob = new Blob([JSON.stringify(state, null, 2)], { type: 'application/json' }); - const url = URL.createObjectURL(blob); - const a = document.createElement('a'); - a.href = url; - a.download = 'mardis_calc.json'; - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); - URL.revokeObjectURL(url); + + const modal = Modals.create('export-modal', { + title: 'Экспорт расчёта', + bodyHtml: ` +
+ +

Файл будет сохранён как mardis_calc.json

+
+ `, + actions: modal => { + const cancelBtn = document.createElement('button'); + cancelBtn.className = 'btn btn-secondary'; + cancelBtn.textContent = 'Отмена'; + cancelBtn.addEventListener('click', () => modal.close()); + + const saveBtn = document.createElement('button'); + saveBtn.className = 'btn btn-accent'; + saveBtn.textContent = 'Сохранить'; + saveBtn.addEventListener('click', () => { + const filenameInput = document.getElementById('export-filename'); + let filename = filenameInput.value.trim() || 'mardis_calc'; + if (!filename.endsWith('.json')) filename += '.json'; + + const blob = new Blob([JSON.stringify(state, null, 2)], { type: 'application/json' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + + modal.close(); + }); + + return [cancelBtn, saveBtn]; + } + }); + + modal.show(); + + // Live preview of filename + setTimeout(() => { + const filenameInput = document.getElementById('export-filename'); + const preview = document.getElementById('export-preview'); + if (filenameInput && preview) { + filenameInput.addEventListener('input', () => { + let name = filenameInput.value.trim() || 'mardis_calc'; + if (!name.endsWith('.json')) name += '.json'; + preview.textContent = name; + }); + } + }, 100); } function importState(file) {