feat(callouts): shared image geometry contract (#1825) #1833

Merged
brenno merged 1 commit from feat/image-geometry-1825 into main 2026-08-28 12:54:57 +00:00
Owner

Summary

De Flutter-vrije ImageViewportGeometry uit §4.1 van docs/design/IMAGE_CALLOUTS.md (rev 4):

  • §4.1 transform — neemt intrinsieke afbeeldingsgrootte, slot, zoom en focal point en geeft het geschilderde afbeeldingsrechterhoek plus gemapte callout-targets
  • Cover vs zoom — twee verschillende operaties die niet commuteren: cover verplaatst de afbeelding via het focal point, zoom verplaatst de box en centreert de afbeelding erin
  • Zoom clamp — elke surface clamp identiek naar 0..400 (§4.3)
  • isWideContain — bepaalt of de CSS-generator .wide of .tall moet gebruiken (§4.2: CSS zelf de richting laten kiezen is tot 2144 px fout)

Vector table

486 gevallen: 3 afbeeldingsformaten (landscape 800×400, portrait 400×800, square 500×500) × 3 slotbreedtes (20%, 40%, 70% van 1920×1080) × 6 zoom-inputs (0, 100, 140, 400, −50, 5000) × 9 focal-paren (0, 0.5, 1 op beide assen). Elk met 8 punt-targets (alle hoeken + rand-midpoints) en één regio.

De pure Dart-implementatie wordt getest tegen een onafhankelijke berekening van §4.1, plus de twee asymmetrieën die makkelijk fout gaan (cover kan de afbeelding niet voorbij zijn eigen rand duwen; zoom kan wel ruimte overlaten).

Bewaker

Deze wijziging voegt een Flutter-vrije geometrie toe die door de renderer, editor en export zal worden gebruikt. Geen bestandsformaatwijziging, geen nieuwe afhankelijkheid, geen uitgaand verkeer. Het is de contractlaag waar #1826-1829 op bouwen.

Test plan

  • make check groen (10723 tests, 87.2% coverage)
  • make check-secrets groen (gitleaks + trufflehog)
  • make sast groen (semgrep, 0 findings)
  • 22 geometry tests: painted rect, target mapping, vector table (486 cases), asymmetries, isWideContain

Generated with Devin

## Summary De Flutter-vrije `ImageViewportGeometry` uit §4.1 van `docs/design/IMAGE_CALLOUTS.md` (rev 4): - **§4.1 transform** — neemt intrinsieke afbeeldingsgrootte, slot, zoom en focal point en geeft het geschilderde afbeeldingsrechterhoek plus gemapte callout-targets - **Cover vs zoom** — twee verschillende operaties die niet commuteren: cover verplaatst de afbeelding via het focal point, zoom verplaatst de box en centreert de afbeelding erin - **Zoom clamp** — elke surface clamp identiek naar 0..400 (§4.3) - **isWideContain** — bepaalt of de CSS-generator `.wide` of `.tall` moet gebruiken (§4.2: CSS zelf de richting laten kiezen is tot 2144 px fout) ### Vector table 486 gevallen: 3 afbeeldingsformaten (landscape 800×400, portrait 400×800, square 500×500) × 3 slotbreedtes (20%, 40%, 70% van 1920×1080) × 6 zoom-inputs (0, 100, 140, 400, −50, 5000) × 9 focal-paren (0, 0.5, 1 op beide assen). Elk met 8 punt-targets (alle hoeken + rand-midpoints) en één regio. De pure Dart-implementatie wordt getest tegen een onafhankelijke berekening van §4.1, plus de twee asymmetrieën die makkelijk fout gaan (cover kan de afbeelding niet voorbij zijn eigen rand duwen; zoom kan wel ruimte overlaten). ### Bewaker Deze wijziging voegt een Flutter-vrije geometrie toe die door de renderer, editor en export zal worden gebruikt. Geen bestandsformaatwijziging, geen nieuwe afhankelijkheid, geen uitgaand verkeer. Het is de contractlaag waar #1826-1829 op bouwen. #### Test plan - [x] `make check` groen (10723 tests, 87.2% coverage) - [x] `make check-secrets` groen (gitleaks + trufflehog) - [x] `make sast` groen (semgrep, 0 findings) - [x] 22 geometry tests: painted rect, target mapping, vector table (486 cases), asymmetries, isWideContain Generated with [Devin](https://devin.ai)
feat(callouts): shared image geometry contract (#1825)
All checks were successful
scans / scans (pull_request) Successful in 4m9s
static-gate / static-gate (pull_request) Successful in 7m34s
7cb57c103b
ImageViewportGeometry: de Flutter-vrije geometrie uit §4.1 van het
ontwerp. Neemt intrinsieke afbeeldingsgrootte, slot, zoom en focal point
en geeft het geschilderde afbeeldingsrechterhoek plus gemapte targets.
Cover en zoom zijn twee verschillende operaties die niet commuteren;
elke surface clamp zoom identiek naar 0..400.

De vector table dekt 486 gevallen (3 formaten × 3 slots × 6 zoom × 9
focal), elk met 8 punt-targets en één regio, getest tegen een
onafhankelijke berekening van §4.1.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
brenno merged commit efa9e644cc into main 2026-08-28 12:54:57 +00:00
Sign in to join this conversation.
No description provided.