2 Commits

Author SHA1 Message Date
s4luorth
3dfcdcd3b5 Kuvert-Absender: groesser + prozentuale Groesse (envelope_sender_scale)
All checks were successful
Build & Deploy / deploy (push) Successful in 19s
Absender-Grundgroesse = Empfaenger-Grundschrift (war 0.62x = zu klein), zusaetzlich
ueber envelope_sender_scale (50-200%) einstellbar. Durchgereicht via Generierung + Vorschau.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-03 11:04:23 +02:00
s4luorth
bffb7a1085 Kuvert: Empfaenger weiter nach rechts (60% statt 52% Breite)
All checks were successful
Build & Deploy / deploy (push) Successful in 20s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-01 15:43:14 +02:00
5 changed files with 12 additions and 8 deletions

View File

@@ -169,6 +169,7 @@ async function generateFromDirectus(req, res, next) {
rawText: order.text_template || null,
// Absender fürs Kuvert (manuelle Aufträge): oben links, Empfänger unten rechts.
envelopeSender: order.envelope_sender || null,
envelopeSenderScale: Number(order.envelope_sender_scale) || 1,
},
});

View File

@@ -330,7 +330,7 @@ async function runGeneration({ orderNumber, letters, metadata }) {
if (isEnv) {
svgResult = generateEnvelopeSVG(
scriptalizedText, letter.format, letter.envelopeType,
{ font: letter.font, realisticHandwriting: letter.realisticHandwriting ?? false, fontScale: letter.fontScale, sender: metadata.envelopeSender || '' }
{ font: letter.font, realisticHandwriting: letter.realisticHandwriting ?? false, fontScale: letter.fontScale, sender: metadata.envelopeSender || '', senderScale: metadata.envelopeSenderScale || 1 }
);
} else {
svgResult = generateLetterSVG(

View File

@@ -167,7 +167,7 @@ async function generateBatch(req, res, next) {
if (letter.type === "envelope") {
const svgResult = generateEnvelopeSVG(
scriptalizedText, letter.format, letter.envelopeType,
{ font: letter.font, realisticHandwriting: letter.realisticHandwriting ?? false, fontScale: letter.fontScale, sender: letter.sender || '' }
{ font: letter.font, realisticHandwriting: letter.realisticHandwriting ?? false, fontScale: letter.fontScale, sender: letter.sender || '', senderScale: letter.senderScale || 1 }
);
if (svgResult.overflow) hasOverflow = true;
const filename = `envelope_${pad}.svg`;

View File

@@ -297,7 +297,7 @@ function generateEnvelopeSVG(text, format, type, options = {}) {
// type === 'recipient' / 'free'. Ist ein Absender gesetzt, sitzt der
// Empfänger UNTEN RECHTS (klassisches Kuvert), sonst wie bisher oben links.
const hatAbsender = !!String(options.sender || '').trim();
const maxWidthPx = Math.min(widthPx - marginLeftPx - 20, widthPx * (hatAbsender ? 0.44 : 0.6));
const maxWidthPx = Math.min(widthPx - marginLeftPx - 20, widthPx * (hatAbsender ? 0.36 : 0.6));
lines = wrapTextToLinesByWidth({
text: String(text || ''),
@@ -309,7 +309,7 @@ function generateEnvelopeSVG(text, format, type, options = {}) {
if (hatAbsender) {
// Empfänger unten rechts – bewusst über Höhen-/Breiten-Anteile, damit der
// große Kuvert-Rand (marginTop bis ~50 % der Höhe) nicht alles nach oben zieht.
startX = Math.round(widthPx * 0.52);
startX = Math.round(widthPx * 0.60);
const untenBaseline = heightPx * 0.80; // unterste Zeile ~20 % über der Unterkante
startY = Math.round(untenBaseline - Math.max(0, lines.length - 1) * lineHeightPx);
} else {
@@ -357,11 +357,14 @@ function generateEnvelopeSVG(text, format, type, options = {}) {
});
}
// Absender oben links (kleiner) – nur wenn gesetzt und kein zentrierter Freitext.
// Absender oben links – nur wenn gesetzt und kein zentrierter Freitext.
const absender = String(options.sender || '').trim();
if (absender && type !== 'custom') {
const absSize = fontSizePx * 0.62;
const absLH = lineHeightPx * 0.62;
// Eigene Absender-Größe (Prozent, 1 = 100%). Grundgröße = Empfänger-Grundschrift
// (früher fix 0.62 → zu klein). Über options.senderScale prozentual einstellbar.
const senderScale = Math.max(0.5, Math.min(2, Number(options.senderScale) || 1));
const absSize = FONT_SIZE_PX * senderScale;
const absLH = lineHeightPx * (absSize / fontSizePx);
const absLines = absender.split('\n').map((l) => l.replace(/\s+$/, ''));
const absPaths = layoutTextToPaths({
lines: absLines,

View File

@@ -41,7 +41,7 @@ async function directusFetch(path, options = {}) {
async function fetchOrder(orderId) {
const fields = [
'id', 'order_number', 'customer_email', 'font', 'status',
'needs_envelope', 'envelope_labeling', 'envelope_text', 'envelope_format', 'envelope_sender',
'needs_envelope', 'envelope_labeling', 'envelope_text', 'envelope_format', 'envelope_sender', 'envelope_sender_scale',
'text_template', 'motif_mode', 'own_cards', 'entries_count', 'preview_session',
'source_file', 'product.key', 'product.type', 'product.input_mode', 'format.key',
'font_scale_letter', 'font_scale_envelope', 'signatures_manual', 'multi_page', 'realistic',