- MacroResolutionService: rank by position specificity (by_label >
first/last > all_slides) so a broad all_slides macro no longer masks
first_slide/last_slide assignments
- ProBundleExportService: resolve macros in a second pass over emitted
slides, so last_slide still matches when files were skipped
- PlaylistExportService: keyvisual is now a transition between content
items instead of a one-shot fallback; nametags use a unified 3-cue
sequence (kv -> kv+name 10s auto-next -> kv) for moderator and preacher
- PlaylistExportService: prepend countdown standby slide (clock + kv)
when the add_countdown_slide setting is enabled
- New SlideMediaElementBuilder converts FOREGROUND (uploaded) image media
actions into slide-content fill.media elements placed at the top of the
slide content, so uploaded information/moderation/sermon images render as
real content rather than a media-layer action.
- Service background and key-visual images remain BACKGROUND media actions on
the bottom layer; song text and name-tag stay text content elements.
- Wire the builder into ProExportService and ProBundleExportService (after
generate) and split PlaylistExportService::writeProFile into
generate -> inject -> write via ProFileWriter so the playlist path applies
the same rule.
- Parser library unchanged.
- Migrate export tests to the combined rule via a shared InspectsSlideFillMedia
support trait and add SlideMediaElementTest.