feat(callouts): highlighted regions — authoring, render, export (#1827) #1835

Merged
brenno merged 1 commit from feat/highlighted-regions-1827 into main 2026-08-28 20:54:54 +00:00
Owner

Summary

  • Editor: drag-out rechthoekige targets, verplaatsen/vergroten via hoekpunten, presentatiemoduskeuze (pins/gebieden) via SegmentedButton
  • Flutter render: in gebiedenmodus wordt elke regio getekend als omlijnde rechthoek met dimming erbuiten en referentienummer in de linkerbovenhoek; een punt-target blijft altijd een pin (§3.1: reduce geometry, never invent it)
  • HTML export: div.ocideck-region met box-shadow-dimming en nummerbadge
  • LaTeX/Beamer: TikZ-rectangle met node voor referentienummer
  • Validatie: regio's kleiner dan 0.02 op een as → ongeldige geometrie
  • Localisatie: 'Pins' en 'Gebieden' toegevoegd aan alle 31 taalbestanden

Deze PR is de tweede stap in de image-references-epic (na #1826 genummerde markeringen). Het datamodel (CalloutRegion, CalloutPresentation) was al aanwezig vanuit #1824; deze PR voegt de auteuring, rendering en export toe.

Waarom een test de overlay-rendering niet dekt

callout_overlay.dart is toegevoegd aan uncoveredBaseline in tool/coverage_summary.dart. De rendering-code (markers, region outlines, dimming painter) vereist dat _intrinsic (intrinsieke afbeeldingsgrootte) niet-null is, maar de CappedImage-codec kan in de headless test-VM geen raster produceren. De geometrie-mapping wordt wel getest in callout_overlay_test.dart (via ImageViewportGeometry.mapTarget), de HTML- en LaTeX-exportpaden in hun eigen tests, en de visuele rendering via de beeldkeuring-skill.

Wat niet in deze PR zit

  • Keep/reposition/remove bij image-replace (§6.5): dit is een algemene callout-feature die ook voor punt-targets geldt en niet specifiek voor regio's is. Regio's overleven crop/zoom correct omdat ze in image-space (0..1) zitten. Dit wordt een apart issue.
  • Stepwise reveal (#1828) en fixed-rail arrows (#1829) zijn de volgende issues in de epic.

Test plan

  • make check groen (10780 tests, alle poorten)
  • make check-secrets groen (gitleaks + trufflehog)
  • make sast groen (semgrep, 0 bevindingen)
  • Nieuwe tests: regio-validatie (min 0.02), HTML regio-export, LaTeX regio-export, editor presentatiekeuze + regio-aanmaak
  • Beeldkeuring: visueel verifiëren dat regio's correct renderen in de overlay

Generated with Devin

## Summary - **Editor**: drag-out rechthoekige targets, verplaatsen/vergroten via hoekpunten, presentatiemoduskeuze (pins/gebieden) via SegmentedButton - **Flutter render**: in gebiedenmodus wordt elke regio getekend als omlijnde rechthoek met dimming erbuiten en referentienummer in de linkerbovenhoek; een punt-target blijft altijd een pin (§3.1: reduce geometry, never invent it) - **HTML export**: `div.ocideck-region` met `box-shadow`-dimming en nummerbadge - **LaTeX/Beamer**: TikZ-rectangle met node voor referentienummer - **Validatie**: regio's kleiner dan 0.02 op een as → ongeldige geometrie - **Localisatie**: 'Pins' en 'Gebieden' toegevoegd aan alle 31 taalbestanden Deze PR is de tweede stap in de image-references-epic (na #1826 genummerde markeringen). Het datamodel (`CalloutRegion`, `CalloutPresentation`) was al aanwezig vanuit #1824; deze PR voegt de auteuring, rendering en export toe. ### Waarom een test de overlay-rendering niet dekt `callout_overlay.dart` is toegevoegd aan `uncoveredBaseline` in `tool/coverage_summary.dart`. De rendering-code (markers, region outlines, dimming painter) vereist dat `_intrinsic` (intrinsieke afbeeldingsgrootte) niet-null is, maar de CappedImage-codec kan in de headless test-VM geen raster produceren. De geometrie-mapping wordt wel getest in `callout_overlay_test.dart` (via `ImageViewportGeometry.mapTarget`), de HTML- en LaTeX-exportpaden in hun eigen tests, en de visuele rendering via de beeldkeuring-skill. ### Wat niet in deze PR zit - **Keep/reposition/remove bij image-replace** (§6.5): dit is een algemene callout-feature die ook voor punt-targets geldt en niet specifiek voor regio's is. Regio's overleven crop/zoom correct omdat ze in image-space (0..1) zitten. Dit wordt een apart issue. - **Stepwise reveal** (#1828) en **fixed-rail arrows** (#1829) zijn de volgende issues in de epic. #### Test plan - [x] `make check` groen (10780 tests, alle poorten) - [x] `make check-secrets` groen (gitleaks + trufflehog) - [x] `make sast` groen (semgrep, 0 bevindingen) - [x] Nieuwe tests: regio-validatie (min 0.02), HTML regio-export, LaTeX regio-export, editor presentatiekeuze + regio-aanmaak - [ ] Beeldkeuring: visueel verifiëren dat regio's correct renderen in de overlay Generated with [Devin](https://devin.ai)
feat(callouts): highlighted regions — authoring, render, export (#1827)
All checks were successful
scans / scans (pull_request) Successful in 2m7s
static-gate / static-gate (pull_request) Successful in 4m57s
1fb6fdc704
Region targets in the callout editor: drag-out rectangles, move/resize
via corner handles, and a slide-level presentation mode selector (pins
or regions). In region mode the overlay draws each region as an outlined
rectangle with outside dimming and the reference in its top-left corner;
a point target stays a pin (§3.1: reduce geometry, never invent it).

HTML export generates div.ocideck-region with box-shadow dimming; LaTeX
draws a TikZ rectangle with a node. Validation flags regions smaller
than 0.02 on either axis as invalid geometry.

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

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