Each slide can now carry its own Traffic Light Protocol level. When the
presentation is shared at a given TLP level, slides classified stricter
than that level are withheld, so the same deck can be shown safely to
audiences with different clearances.
- Slide.tlp field with markdown round-trip via a <!-- tlp: <key> --> marker
(also on code slides).
- Editor: a per-slide "TLP van deze slide" dropdown.
- Central rule slideVisibleAtTlp() compares levels on the TLP severity
order (none < CLEAR < GREEN < AMBER < AMBER+STRICT < RED).
- Filtering lives in _slidesForPresentationOrExport, the single source of
slides for presenting (single-window and dual-screen) and for every
export (PDF, PPTX, HTML), so all paths honour it.
- Translations for the new strings in all supported languages, plus tests
for the round-trip and the visibility rule.
flutter analyze is clean and all tests pass.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
When a second display is connected (macOS), presenting now opens a
borderless audience window on the beamer showing the slide, while the
main window shows the presenter view (current/next slide, speaker notes,
clock, controls) on the laptop. The two windows stay in sync over method
channels: navigation, blank screen, audio-complete and beamer clicks are
forwarded between them, and media plays only on the beamer to avoid
double audio. Falls back to the existing single-window presenter when
there is one display or the second window can't be created.
- Vendors a fork of desktop_multi_window in third_party/ that re-adds the
native macOS window geometry/fullscreen calls (coverScreen, setFrame,
close) the published 0.3.0 dropped; wired via a path dependency.
- Registers the app's plugins for sub-windows in MainFlutterWindow so
video/image rendering works on the beamer.
- Routes the multi_window dart entrypoint to a minimal AudienceWindowApp.
Compiles (flutter analyze + macOS debug build) and all tests pass;
runtime two-screen behaviour still needs verification on real hardware.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Bundles several in-progress changes from the working tree:
- App appearance / look-and-feel: customizable app theme profiles
(colors, dark interface) with a settings UI and persistence.
- New "Broncode" (source code) slide type: dark code sheet with
syntax highlighting, a dedicated editor with a language picker,
and Marp markdown round-trip via a fenced code block.
- Presenter: eliminate the brief black frame between slides by
precaching neighbouring slide images and enabling gaplessPlayback,
so recordings stay clean.
Adds round-trip tests for the code slide and translations for the
new strings across all supported languages.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Privacy: replace the runtime google_fonts fetch with a locally bundled
EB Garamond (variable TTFs + OFL license), so the app no longer contacts
Google's servers. Removes the google_fonts dependency.
PDF export:
- Add a normal/compressed image-quality choice in the export dialog.
Compressed re-encodes slides as JPEG (q60) at 1280px for a small handout,
saved as a separate "-compact" file.
- Add a configurable export directory (Settings → Exportmap); when unset,
exports land next to the deck as before.
- Prefix every export with a UTC timestamp (YYYYMMDDHHMMSS) so exports sort
chronologically and never overwrite each other.
Tests: export service (compression, output dir, timestamp) and an export
dialog widget test asserting the quality choice renders.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Flutter desktop app for building Marp presentations via structured
slide editors, with live preview, fullscreen presenter, and PDF/PPTX
export. Includes Makefile quality gate, CI workflow, and full test suite.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>