@invarn/cibuild 2.1.6 → 2.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -142,6 +142,10 @@ export interface StructuralOverhang {
|
|
|
142
142
|
/** …and that wrong size matches the frame's size — the parent-relative
|
|
143
143
|
* (`fillMaxHeight`/`matchParentSize`) signature. The fix is a fixed size. */
|
|
144
144
|
frameRelative: boolean;
|
|
145
|
+
/** The clip delta is explained by the element's frame-relative POSITION on the
|
|
146
|
+
* clip axis being wrong (an offset, not a size). Frame-relative position is NOT
|
|
147
|
+
* the suppressed absolute-x/y canvas artifact — it changes the real clip. */
|
|
148
|
+
positionDriven: boolean;
|
|
145
149
|
}
|
|
146
150
|
export interface StructuralGeometryElement {
|
|
147
151
|
id: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structural-facts.d.ts","sourceRoot":"","sources":["../../../../src/yaml/steps/structural-facts.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"structural-facts.d.ts","sourceRoot":"","sources":["../../../../src/yaml/steps/structural-facts.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
|
@@ -345,6 +345,30 @@ const OVERHANG_GUEST_DUMP = {
|
|
|
345
345
|
],
|
|
346
346
|
};
|
|
347
347
|
const OVERHANG_GUEST_REF = { banner: { x: 0, y: 0, w: 343, h: 111 }, voucher: { x: 272, y: 19, w: 109, h: 109 } };
|
|
348
|
+
// Voucher is the correct 81×81 size but sits 5dp too high (y 11 vs design 16),
|
|
349
|
+
// so the bottom clip is 5dp short (overhang 20 vs 25) for a POSITION reason.
|
|
350
|
+
const OVERHANG_POSITION_DUMP = {
|
|
351
|
+
canvas: { left: 0, top: 0, right: 800, bottom: 200 },
|
|
352
|
+
nodes: [
|
|
353
|
+
{ id: 'node-1', bounds: { left: 0, top: 0, right: 800, bottom: 200 }, unclippedBounds: { left: 0, top: 0, right: 800, bottom: 200 }, parentId: null, clipsChildren: false },
|
|
354
|
+
{ id: 'card', bounds: { left: 0, top: 0, right: 686, bottom: 144 }, unclippedBounds: { left: 0, top: 0, right: 686, bottom: 144 }, parentId: 'node-1', clipsChildren: false },
|
|
355
|
+
{ id: 'voucher', bounds: { left: 578, top: 22, right: 740, bottom: 184 }, unclippedBounds: { left: 578, top: 22, right: 740, bottom: 184 }, parentId: 'card', clipsChildren: false },
|
|
356
|
+
],
|
|
357
|
+
};
|
|
358
|
+
const OVERHANG_POSITION_REF = { card: { x: 0, y: 0, w: 343, h: 72 }, voucher: { x: 289, y: 16, w: 81, h: 81 } };
|
|
359
|
+
// MISSING clip: the voucher is squashed + sits tangent to the card edges, so the
|
|
360
|
+
// render does NOT overflow at all (no clip), while the design overflows-and-clips
|
|
361
|
+
// (right 27 / bottom 25). Signal B v1 was SILENT here (no rendered overflow → no
|
|
362
|
+
// overhang). The symmetric (design-side) candidate rule must flag it.
|
|
363
|
+
const OVERHANG_MISSING_DUMP = {
|
|
364
|
+
canvas: { left: 0, top: 0, right: 800, bottom: 200 },
|
|
365
|
+
nodes: [
|
|
366
|
+
{ id: 'node-1', bounds: { left: 0, top: 0, right: 800, bottom: 200 }, unclippedBounds: { left: 0, top: 0, right: 800, bottom: 200 }, parentId: null, clipsChildren: false },
|
|
367
|
+
{ id: 'card', bounds: { left: 0, top: 0, right: 686, bottom: 142 }, unclippedBounds: { left: 0, top: 0, right: 686, bottom: 142 }, parentId: 'node-1', clipsChildren: false },
|
|
368
|
+
{ id: 'voucher', bounds: { left: 524, top: 0, right: 686, bottom: 142 }, unclippedBounds: { left: 524, top: 0, right: 686, bottom: 142 }, parentId: 'card', clipsChildren: false },
|
|
369
|
+
],
|
|
370
|
+
};
|
|
371
|
+
const OVERHANG_MISSING_REF = { card: { x: 0, y: 0, w: 343, h: 72 }, voucher: { x: 289, y: 16, w: 81, h: 81 } };
|
|
348
372
|
describe('buildStructuralBlock — per-edge overhang (Signal B v2)', () => {
|
|
349
373
|
test('logged-in voucher: flags the bottom clip (Δ−9), not the matching right edge', () => {
|
|
350
374
|
const block = buildStructuralBlock(OVERHANG_LOGGED_IN_DUMP, OVERHANG_LOGGED_IN_REF, 2);
|
|
@@ -359,6 +383,7 @@ describe('buildStructuralBlock — per-edge overhang (Signal B v2)', () => {
|
|
|
359
383
|
// the frame (the fillMaxHeight tell) — a sizing defect, not an intended clip.
|
|
360
384
|
sizeDriven: true,
|
|
361
385
|
frameRelative: true,
|
|
386
|
+
positionDriven: false,
|
|
362
387
|
});
|
|
363
388
|
expect(block.summary.clean).toBe(false);
|
|
364
389
|
expect(block.summary.maxClipDeltaDp).toBe(9);
|
|
@@ -374,6 +399,7 @@ describe('buildStructuralBlock — per-edge overhang (Signal B v2)', () => {
|
|
|
374
399
|
clipFlag: false,
|
|
375
400
|
sizeDriven: false,
|
|
376
401
|
frameRelative: false,
|
|
402
|
+
positionDriven: false,
|
|
377
403
|
});
|
|
378
404
|
});
|
|
379
405
|
test('a fully-contained element gets no overhang block', () => {
|
|
@@ -382,6 +408,49 @@ describe('buildStructuralBlock — per-edge overhang (Signal B v2)', () => {
|
|
|
382
408
|
expect(voucher?.overhang).toBeUndefined();
|
|
383
409
|
expect(block.summary.maxClipDeltaDp).toBe(0);
|
|
384
410
|
});
|
|
411
|
+
// Correct SIZE (81×81) but positioned 5dp too high → the bottom clip comes out
|
|
412
|
+
// short (20 vs 25) for a POSITION reason, not a size one. This is the residual
|
|
413
|
+
// that got waved off as "sub-pixel rounding": positionDriven must flag it.
|
|
414
|
+
test('a correctly-sized element clipped wrong by its position is positionDriven, not sizeDriven', () => {
|
|
415
|
+
const block = buildStructuralBlock(OVERHANG_POSITION_DUMP, OVERHANG_POSITION_REF, 2);
|
|
416
|
+
const voucher = block.geometry?.elements.find((e) => e.id === 'voucher');
|
|
417
|
+
expect(voucher?.overhang).toEqual({
|
|
418
|
+
unit: 'dp',
|
|
419
|
+
rendered: { right: 27, bottom: 20 },
|
|
420
|
+
design: { right: 27, bottom: 25 },
|
|
421
|
+
deltas: [{ edge: 'bottom', delta: -5 }],
|
|
422
|
+
clipFlag: true,
|
|
423
|
+
sizeDriven: false,
|
|
424
|
+
frameRelative: false,
|
|
425
|
+
positionDriven: true,
|
|
426
|
+
});
|
|
427
|
+
const review = buildReviewScaffold(block);
|
|
428
|
+
const clipRow = review.rows.find((r) => r.element === 'voucher' && r.fact.startsWith('clip'));
|
|
429
|
+
expect(clipRow?.fact).toBe('clip bottom 20dp vs design 25dp (-5) — driven by the element\'s position relative to the frame; reposition to the design offset');
|
|
430
|
+
});
|
|
431
|
+
test('a MISSING clip (design overflows, render contained/tangent) flags via the design-side candidate', () => {
|
|
432
|
+
const block = buildStructuralBlock(OVERHANG_MISSING_DUMP, OVERHANG_MISSING_REF, 2);
|
|
433
|
+
const voucher = block.geometry?.elements.find((e) => e.id === 'voucher');
|
|
434
|
+
expect(voucher?.overhang).toEqual({
|
|
435
|
+
unit: 'dp',
|
|
436
|
+
rendered: { right: 0, bottom: 0 },
|
|
437
|
+
design: { right: 27, bottom: 25 },
|
|
438
|
+
deltas: [
|
|
439
|
+
{ edge: 'right', delta: -27 },
|
|
440
|
+
{ edge: 'bottom', delta: -25 },
|
|
441
|
+
],
|
|
442
|
+
clipFlag: true,
|
|
443
|
+
sizeDriven: true,
|
|
444
|
+
frameRelative: true,
|
|
445
|
+
positionDriven: true,
|
|
446
|
+
});
|
|
447
|
+
expect(block.summary.clean).toBe(false);
|
|
448
|
+
expect(block.summary.maxClipDeltaDp).toBe(27);
|
|
449
|
+
const review = buildReviewScaffold(block);
|
|
450
|
+
const clipRow = review.rows.find((r) => r.element === 'voucher' && r.fact.startsWith('clip'));
|
|
451
|
+
expect(clipRow?.fact).toContain('right 0dp vs design 27dp (-27)');
|
|
452
|
+
expect(clipRow?.fact).toContain('reposition to the design offset');
|
|
453
|
+
});
|
|
385
454
|
});
|
|
386
455
|
describe('buildReviewScaffold — run-only verdict obligation', () => {
|
|
387
456
|
test('forces a verdict per flagged element + fact, with the golden mustExplain', () => {
|
|
@@ -428,6 +497,8 @@ describe('embedded geometry stage parity', () => {
|
|
|
428
497
|
{ name: 'withGeometry', dump: HUB_PROMO_DUMP, ref: HUB_PROMO_REFERENCE },
|
|
429
498
|
{ name: 'overhangLoggedIn', dump: OVERHANG_LOGGED_IN_DUMP, ref: OVERHANG_LOGGED_IN_REF },
|
|
430
499
|
{ name: 'overhangGuest', dump: OVERHANG_GUEST_DUMP, ref: OVERHANG_GUEST_REF },
|
|
500
|
+
{ name: 'overhangPosition', dump: OVERHANG_POSITION_DUMP, ref: OVERHANG_POSITION_REF },
|
|
501
|
+
{ name: 'overhangMissing', dump: OVERHANG_MISSING_DUMP, ref: OVERHANG_MISSING_REF },
|
|
431
502
|
];
|
|
432
503
|
for (const { name, dump, ref } of parityCases) {
|
|
433
504
|
test(`embedded buildStructuralBlock matches the module (${name})`, () => {
|