diff --git a/frontend/public/stamps/ai-black.png b/frontend/public/stamps/ai-black.png
new file mode 100644
index 0000000..cd64105
Binary files /dev/null and b/frontend/public/stamps/ai-black.png differ
diff --git a/frontend/public/stamps/ai-white.png b/frontend/public/stamps/ai-white.png
new file mode 100644
index 0000000..20dd6e4
Binary files /dev/null and b/frontend/public/stamps/ai-white.png differ
diff --git a/frontend/public/stamps/generated-black.png b/frontend/public/stamps/generated-black.png
new file mode 100644
index 0000000..4c2f82f
Binary files /dev/null and b/frontend/public/stamps/generated-black.png differ
diff --git a/frontend/public/stamps/generated-white.png b/frontend/public/stamps/generated-white.png
new file mode 100644
index 0000000..2c056b8
Binary files /dev/null and b/frontend/public/stamps/generated-white.png differ
diff --git a/frontend/public/stamps/modified-black.png b/frontend/public/stamps/modified-black.png
new file mode 100644
index 0000000..c667e0c
Binary files /dev/null and b/frontend/public/stamps/modified-black.png differ
diff --git a/frontend/public/stamps/modified-white.png b/frontend/public/stamps/modified-white.png
new file mode 100644
index 0000000..1de7f1b
Binary files /dev/null and b/frontend/public/stamps/modified-white.png differ
diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte
index 522a57f..e973161 100644
--- a/frontend/src/App.svelte
+++ b/frontend/src/App.svelte
@@ -10,6 +10,7 @@
import HowItWorks from './components/HowItWorks.svelte';
import LegalModal from './components/LegalModal.svelte';
import CropModal from './components/CropModal.svelte';
+ import AILabelOptions from './components/AILabelOptions.svelte';
import { createProgress } from './stores/progress.svelte.js';
import { BUNDLE_PRESETS, PACK_PRESETS } from './lib/presets.js';
@@ -17,6 +18,10 @@
let files = $state([]); // [{ file, url }]
let selectedPresets = $state([]); // preset name strings
+ let aiLabelEnabled = $state(false);
+ let aiLabelStyle = $state('generated');
+ let aiLabelColor = $state('black');
+ let aiLabelPosition = $state('bottom-right');
let legalOpen = $state(null); // 'imprint' | 'privacy' | null
// The file entry whose crop is being adjusted, or null. Owned here (not in
// Dropzone) so CropModal renders at the page root, escaping the animate-fade-up
@@ -70,6 +75,11 @@
for (const entry of files) form.append('files', entry.file);
form.append('focals', JSON.stringify(focals));
for (const name of selectedPresets) form.append('presets', name);
+ if (aiLabelEnabled) {
+ form.append('aiLabel', aiLabelStyle);
+ form.append('aiLabelColor', aiLabelColor);
+ form.append('aiLabelPosition', aiLabelPosition);
+ }
let jobId;
try {
@@ -91,6 +101,10 @@
progress.reset();
files = [];
selectedPresets = [];
+ aiLabelEnabled = false;
+ aiLabelStyle = 'generated';
+ aiLabelColor = 'black';
+ aiLabelPosition = 'bottom-right';
cropping = null;
autoDownloaded = false;
}
@@ -158,11 +172,19 @@
+