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: `
+
+ `,
+ 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) {