From 55c0054ad8088d626b57dc20da79d1179769dc3d Mon Sep 17 00:00:00 2001 From: Till Heidrich Date: Sat, 10 Oct 2026 06:34:05 +0000 Subject: [PATCH] First visit ends in a sheet, not in an empty box MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A fresh print-only install showed "Pick from the library" as the second way in — on an instance that has no library, because the library belongs to the AI module. The button opened an empty picker. It is gone when the module is off (`hasLibrary`), together with the two smaller "from the library" links. In its place: "Try it with a sample photo". It fetches public/samples/lake-at-dusk.jpg — an original illustration drawn for this, no third-party material — and sends it through the normal upload, so everything after it is what happens with a real picture. Checked in the browser, English and German, on a print-only instance: no library button, sample loads, the print button enables, the PDF measures 210.00 x 297.00 mm, no failed request. --- public/samples/README.md | 9 ++++++++ public/samples/lake-at-dusk.jpg | Bin 0 -> 43869 bytes src/components/PrintApp.tsx | 37 +++++++++++++++++++++++++------- src/locales/de.json | 3 +++ src/pages/print.astro | 2 +- 5 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 public/samples/README.md create mode 100644 public/samples/lake-at-dusk.jpg diff --git a/public/samples/README.md b/public/samples/README.md new file mode 100644 index 0000000..ca1b1fc --- /dev/null +++ b/public/samples/README.md @@ -0,0 +1,9 @@ +# Sample image + +`lake-at-dusk.jpg` is an original illustration drawn for Klarbild as vector +shapes and rendered to JPEG. It contains no third-party material and is +covered by the repository's licence like everything else here. + +It exists so that the first visit to a fresh instance can end in a printed +sheet: the "Try it with a sample photo" button in the print studio uploads +it through the normal upload path. diff --git a/public/samples/lake-at-dusk.jpg b/public/samples/lake-at-dusk.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7cc0d9fe1ae039ce0e6a99aca1234b46ba6856ce GIT binary patch literal 43869 zcmeFa2_TeP|2RHUDTPWZd)+K0OZIJ0DJol1$$mv9StbU98Fbr}wJ5TT2}LDjH`XL3 z+YH&avCr5CGnT>ddq&Hx?)|>^UA}#L-~azTp7os1`RwQOInQ~Xrq#C9PLL*O!&=!0 zlues~zpYzXS+{K6!Nv~!?cm+Mb33r{?&06F3)m0+A|UX~AsMj)VlrR_1+eZ(U0d5b z3?xkdGLpBT?VDKYH*_&G{Q_FIor!rn)9O1AABc&G3B=4ed@fAunAdOE$g&A&<^9z5 zdm{*FWCB`OJ3w2RnLz8dF>eFW?Ycf7_`3a)#JP*tG zzg90G<_Y8fbE5)OwI2Nx!^Xe)JPQ7$GnanFPf!}yQ`=Gt^1kX;FrEJg3EmTXM}Cj6aVIk9vHE=e}-aqUWlFi z4+v%EKO^n_EMIl`5AfBWG9x*f{O>$h|1@nm|5KiJ?SD>O{W)3s=TLq2Qw;lamN9

Iik3fj415wswmk0 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 M9DD~+5x)=q7e;?O1^@s6 literal 0 HcmV?d00001 diff --git a/src/components/PrintApp.tsx b/src/components/PrintApp.tsx index 12c583f..8118396 100644 --- a/src/components/PrintApp.tsx +++ b/src/components/PrintApp.tsx @@ -110,8 +110,8 @@ function shrink(dataUrl: string, maxEdge = 700): Promise<{ url: string; w: numbe /* ========================================================================== */ -export default function PrintApp({ locale, dict, canDeliver = false }: - { locale?: Locale; dict?: Dict | null; canDeliver?: boolean }) { +export default function PrintApp({ locale, dict, canDeliver = false, hasLibrary = true }: + { locale?: Locale; dict?: Dict | null; canDeliver?: boolean; hasLibrary?: boolean }) { const t = useT(dict); const [cells, setCells] = useState([]); const [paperId, setPaperId] = useState('A4'); @@ -335,6 +335,17 @@ export default function PrintApp({ locale, dict, canDeliver = false }: } catch { notify(t('These settings could not be applied.'), true); } }; + // A photo to try it with, for the first visit — before anyone has picked a + // picture of their own. It goes through the normal upload, so what follows is + // exactly what happens with a real image. (An original illustration made for + // Klarbild; public/samples/README.md says so.) + const addSample = async () => { + try { + const blob = await fetch('/samples/lake-at-dusk.jpg').then((r) => { if (!r.ok) throw new Error(); return r.blob(); }); + await addFiles([new File([blob], 'lake-at-dusk.jpg', { type: 'image/jpeg' })]); + } catch { notify(t('The sample photo could not be loaded.')); } + }; + const addFromLibrary = (it: any) => { const [w, h] = String(it.output_px || '').split(/[x×]/).map((n: string) => parseInt(n, 10) || 0); const id = uid(); @@ -500,7 +511,7 @@ export default function PrintApp({ locale, dict, canDeliver = false }:

- + {hasLibrary && } {cells.length > 0 && ( + {hasLibrary ? ( + + ) : ( + // Print-only instance: there is no library to pick from. The + // second way in is a sample, so the first visit ends in a + // sheet and not in an empty box. + + )} {presets.length > 0 && (
{t('Or start from a preset')} @@ -559,7 +580,7 @@ export default function PrintApp({ locale, dict, canDeliver = false }: ))}
- + {hasLibrary && }
)} diff --git a/src/locales/de.json b/src/locales/de.json index 98c6868..4ea1921 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -564,6 +564,7 @@ "No mail sending is set up on this server yet — the address is stored, but nothing arrives yet. An admin sets that up under Admin → Email.": "Auf diesem Server ist noch kein E-Mail-Versand eingerichtet — die Adresse wird zwar gespeichert, es kommt aber noch nichts an. Ein Admin richtet das unter Admin → E-Mail ein.", "No models yet. Add one from the available ones:": "Noch keine Modelle. Aus verfügbaren hinzufügen:", "No paired chats yet.": "Noch keine gekoppelten Chats.", + "No picture at hand? Take ours, pick a preset below and make the PDF.": "Gerade kein Bild zur Hand? Nimm unseres, wähl unten eine Vorlage und mach das PDF.", "No sending set up yet — forgotten password, job notices and mailing share links do not work until then.": "Noch kein Versand eingerichtet — Passwort vergessen, Auftragshinweise und der Mailversand von Teilen-Links funktionieren bis dahin nicht.", "No token generated yet.": "Noch kein Token erzeugt.", "No valid image size chosen yet.": "Noch kein gültiges Bildmaß gewählt.", @@ -849,6 +850,7 @@ "The password is stored encrypted and never shown again.": "Das Passwort wird verschlüsselt gespeichert und nie wieder angezeigt.", "The problem": "Das Problem", "The same image once more — for a second format, say": "Dasselbe Bild noch einmal — z. B. für ein zweites Format", + "The sample photo could not be loaded.": "Das Beispielfoto ließ sich nicht laden.", "The second way out for large sizes: the image is spread across several sheets. The tiles overlap by a glue flap, which is printed on both neighbouring sheets and marked with a dashed line. Every sheet carries its number with row and column.": "Der zweite Weg für große Maße: Das Bild wird auf mehrere Blätter verteilt. Die Kacheln überlappen sich um einen Klebefalz, der auf beiden Nachbarblättern gedruckt und gestrichelt markiert wird. Jedes Blatt trägt seine Nummer samt Reihe und Spalte.", "The trash is empty": "Der Papierkorb ist leer", "The trash is switched off — deleting is final.": "Der Papierkorb ist abgeschaltet — Löschen ist endgültig.", @@ -878,6 +880,7 @@ "Trash · {n}": "Papierkorb · {n}", "True to size": "Maßhaltig", "Try again": "Noch einmal versuchen", + "Try it with a sample photo": "Mit einem Beispielfoto ausprobieren", "US visa 51 × 51 mm (2 × 2 in)": "Visum USA 51 × 51 mm (2 × 2 in)", "Under “File names” the existing library can be brought onto the unique naming scheme. “Check library” first shows what would change and how many names are currently used twice; “Rename now” carries it out. The image files themselves are left untouched — they sit in storage under their id, not under their name. A second run changes nothing. “Deliver again” then uploads every already delivered image under its new name; the old files stay on the delivery target and you clear them away there yourself.": "Unter „Dateinamen\" lässt sich die vorhandene Bibliothek auf das eindeutige Namensschema bringen. „Bibliothek prüfen\" zeigt zuerst, was sich ändern würde und wie viele Namen aktuell doppelt vergeben sind; „Jetzt umbenennen\" setzt es um. Die Bilddateien selbst bleiben dabei unangetastet — sie liegen im Speicher unter ihrer Kennung, nicht unter ihrem Namen. Ein zweiter Lauf ändert nichts mehr. „Erneut ausliefern\" lädt danach alle schon ausgelieferten Bilder unter dem neuen Namen erneut hoch; die alten Dateien bleiben am Ziel liegen und räumst du dort selbst weg.", "Under the hood": "Unter der Haube", diff --git a/src/pages/print.astro b/src/pages/print.astro index c25561f..8f2a237 100644 --- a/src/pages/print.astro +++ b/src/pages/print.astro @@ -12,7 +12,7 @@ const dict = dictFor(locale);

{t('No AI: bring images to exact sizes and place several of them at 100% size with crop marks on one sheet — from the biometric passport photo through the school photo set to the 30 × 40 poster.')}

- +