feat: all AI formats printable, crop-vs-border rule, mobile layout, Passbilder rename
Print now offers every format the AI pipeline knows (9x13 to 60x90, DIN A6-A2, squares, poster/frame sizes to 70x100, and the screen ratios as physical sizes). When a picture does not match the target ratio the user picks per image between cropping to fill and keeping the whole picture on a border colour - never a stretch. The module is called Passbilder now; /druck redirects. Fixes two real defects: sharp runs extend after resize, so padded cells came out oversized (a 35x45 mm cell became 35x171 mm with a border), and the grid packer rotated a single portrait photo just because more would fit sideways. Mobile: cards become rows, touch targets ~40px, crop editor as a bottom sheet. Verified at 390/820/1440px - all three produce the same PDF.
This commit is contained in:
@@ -132,3 +132,23 @@ test('Formattabellen sind konsistent', () => {
|
||||
assert.equal(labelMm(35, 45), '35 × 45 mm');
|
||||
assert.equal(labelMm(120, 150), '12 × 15 cm');
|
||||
});
|
||||
|
||||
test('Die gewählte Ausrichtung bleibt, wenn sie nicht mehr Bogen kostet', () => {
|
||||
// Ein einzelnes Passbild darf nicht quer gelegt werden, nur weil hochkant
|
||||
// mehr auf den Bogen passen würden.
|
||||
const res = layout([{ id: 'p', wMm: 35, hMm: 45, count: 1, allowRotate: true }], A4);
|
||||
assert.equal(res.pages[0].placements[0].rotated, false);
|
||||
assert.equal(res.pages[0].placements[0].w, 35);
|
||||
|
||||
// 25 × 15 cm auf A4 hoch: quer ist es zu breit (250 > 200 mm Nutzbreite),
|
||||
// gedreht passt es — dann muss gedreht werden.
|
||||
const gross = layout([{ id: 'g', wMm: 250, hMm: 150, count: 1, allowRotate: true }], A4);
|
||||
assert.equal(gross.pages.length, 1);
|
||||
assert.equal(gross.pages[0].placements[0].rotated, true);
|
||||
assert.equal(gross.pages[0].placements[0].w, 150);
|
||||
|
||||
// Ohne Dreherlaubnis bleibt es liegen und wird als „passt nicht" gemeldet.
|
||||
const stur = layout([{ id: 'g', wMm: 250, hMm: 150, count: 1, allowRotate: false }], A4);
|
||||
assert.equal(stur.pages.length, 0);
|
||||
assert.equal(stur.unplaced.length, 1);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user