feat(callouts): numbered markers from authoring to export (#1826) #1834

Merged
brenno merged 1 commit from feat/numbered-markers-1826 into main 2026-08-28 14:55:36 +00:00
Owner

Summary

  • Editor: CalloutEditorDialog in the Bullets+image editor — assign a reference letter (A–Z) to a bullet, click on the image to place a target, edit the screen-reader description, delete
  • Flutter render: CalloutOverlay widget paints numbered markers on the image slot using ImageViewportGeometry (#1825) to map targets from image space to slot pixels
  • HTML export: callout markup with .ocideck-callout spans, aria-label/aria-describedby for screen readers, zoom/cover CSS
  • LaTeX/Beamer: TikZ nodes with relative coordinates (0–1) on the image, using ocideckTableAccent colour
  • Raster export (PDF/PPTX/ODP): markers render via the real slide preview widget (no extra code needed)
  • Reference allocator: skips letters already used as trailing prose on the slide (§6.1)
  • Recovery: quality analyzer warns about orphan references; overlay renders nothing when image is removed
  • Accessibility: Semantics labels on markers, ARIA attributes in HTML, standard Material widgets in editor
  • Localization: 8 new strings translated to all 31 languages

Test plan

  • make check green (formatting, static analysis, conventions, privacy boundary, method length, dead-code, hardcoded text, comment language, full test suite, coverage floor, per-file coverage floor)
  • Secrets scan clean (gitleaks + trufflehog)
  • SAST clean (semgrep)
  • 38 new tests covering callout_reference_allocator, marp_html_service_callouts, callout_overlay, callout_editor
  • All 10770 tests pass

Generated with Devin

## Summary - **Editor**: CalloutEditorDialog in the Bullets+image editor — assign a reference letter (A–Z) to a bullet, click on the image to place a target, edit the screen-reader description, delete - **Flutter render**: CalloutOverlay widget paints numbered markers on the image slot using ImageViewportGeometry (#1825) to map targets from image space to slot pixels - **HTML export**: callout markup with `.ocideck-callout` spans, `aria-label`/`aria-describedby` for screen readers, zoom/cover CSS - **LaTeX/Beamer**: TikZ nodes with relative coordinates (0–1) on the image, using `ocideckTableAccent` colour - **Raster export (PDF/PPTX/ODP)**: markers render via the real slide preview widget (no extra code needed) - **Reference allocator**: skips letters already used as trailing prose on the slide (§6.1) - **Recovery**: quality analyzer warns about orphan references; overlay renders nothing when image is removed - **Accessibility**: Semantics labels on markers, ARIA attributes in HTML, standard Material widgets in editor - **Localization**: 8 new strings translated to all 31 languages ## Test plan - [x] `make check` green (formatting, static analysis, conventions, privacy boundary, method length, dead-code, hardcoded text, comment language, full test suite, coverage floor, per-file coverage floor) - [x] Secrets scan clean (gitleaks + trufflehog) - [x] SAST clean (semgrep) - [x] 38 new tests covering callout_reference_allocator, marp_html_service_callouts, callout_overlay, callout_editor - [x] All 10770 tests pass Generated with [Devin](https://devin.ai)
feat(callouts): numbered markers from authoring to export (#1826)
All checks were successful
scans / scans (pull_request) Successful in 2m21s
static-gate / static-gate (pull_request) Successful in 6m11s
64a5cc7278
The first usable version of image references: the author assigns a
reference letter (A–Z) to a bullet, clicks on the image to place a
target, and fills in a screen-reader description. Markers render in
the Flutter preview, presenter, audience display, HTML export (with
aria-label/aria-describedby), LaTeX/Beamer (TikZ nodes with relative
coordinates), and raster exports (PDF/PPTX/ODP via the real preview
widget).

The reference allocator skips letters already used as trailing prose
on the slide, so it never manufactures the collision §2.6 reports.
The callout editor is a dialog in the Bullets+image editor; the
callout overlay is a standalone widget using ImageViewportGeometry
(#1825) to map targets from image space to slot pixels.

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

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